Skip to content

Commit aaef7b2

Browse files
authored
feat!: reduce msig and lsig exports (#492)
* feat!: reduce msig and lsig exports * chore: fix typo appply -> apply
1 parent 701bf89 commit aaef7b2

File tree

6 files changed

+480
-275
lines changed

6 files changed

+480
-275
lines changed

packages/transact/src/logicsig.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { encodeMsgpack } from '@algorandfoundation/algokit-common'
22
import { describe, expect, test } from 'vitest'
3-
import { decodeLogicSignature } from './logicsig'
3+
import { LogicSigAccount } from './logicsig'
44
import { LogicSignature } from './transactions/signed-transaction'
55
import { logicSignatureCodec } from './transactions/signed-transaction-meta'
66

77
describe('logicsig', () => {
8-
describe('decodeLogicSignature', () => {
8+
describe('LogicSigAccount.fromBytes', () => {
99
test('should decode logic signature with signature', () => {
1010
const signature = new Uint8Array(64).fill(42)
1111
const logicSignature = {
@@ -15,7 +15,7 @@ describe('logicsig', () => {
1515
} satisfies LogicSignature
1616
const encoded = encodeMsgpack(logicSignatureCodec.encode(logicSignature, 'msgpack'))
1717

18-
const decoded = decodeLogicSignature(encoded)
18+
const decoded = LogicSigAccount.fromBytes(encoded)
1919

2020
expect(decoded.logic).toEqual(logicSignature.logic)
2121
expect(decoded.sig).toEqual(signature)

packages/transact/src/logicsig.ts

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,9 @@
1-
import { Address, concatArrays, decodeMsgpack, hash, isValidAddress } from '@algorandfoundation/algokit-common'
1+
import { Address, concatArrays, decodeMsgpack, hash } from '@algorandfoundation/algokit-common'
22
import { MultisigAccount } from './multisig'
33
import { TransactionSigner } from './signer'
44
import { LogicSignature, MultisigSignature, SignedTransaction, encodeSignedTransaction } from './transactions/signed-transaction'
5-
import { logicSignatureCodec } from './transactions/signed-transaction-meta'
65
import { Transaction } from './transactions/transaction'
7-
8-
// base64regex is the regex to test for base64 strings
9-
const base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/
10-
11-
/** sanityCheckProgram performs heuristic program validation:
12-
* check if passed in bytes are Algorand address or is B64 encoded, rather than Teal bytes
13-
*
14-
* @param program - Program bytes to check
15-
*/
16-
export function sanityCheckProgram(program: Uint8Array) {
17-
if (!program || program.length === 0) throw new Error('empty program')
18-
19-
const lineBreakOrd = '\n'.charCodeAt(0)
20-
const blankSpaceOrd = ' '.charCodeAt(0)
21-
const tildeOrd = '~'.charCodeAt(0)
22-
23-
const isPrintable = (x: number) => blankSpaceOrd <= x && x <= tildeOrd
24-
const isAsciiPrintable = program.every((x: number) => x === lineBreakOrd || isPrintable(x))
25-
26-
if (isAsciiPrintable) {
27-
const programStr = new TextDecoder().decode(program)
28-
29-
if (isValidAddress(programStr)) throw new Error('requesting program bytes, get Algorand address')
30-
31-
if (base64regex.test(programStr)) throw new Error('program should not be b64 encoded')
32-
33-
throw new Error('program bytes are all ASCII printable characters, not looking like Teal byte code')
34-
}
35-
}
6+
import { logicSignatureCodec } from './transactions/signed-transaction-meta'
367

378
const PROGRAM_TAG = new TextEncoder().encode('Program')
389
const MSIG_PROGRAM_TAG = new TextEncoder().encode('MsigProgram')
@@ -51,6 +22,20 @@ export class LogicSigAccount {
5122
msig?: MultisigSignature
5223
lmsig?: MultisigSignature
5324

25+
static fromSignature(signature: LogicSignature): LogicSigAccount {
26+
const lsigAccount = new LogicSigAccount(signature.logic, signature.args || [])
27+
lsigAccount.sig = signature.sig
28+
lsigAccount.msig = signature.msig
29+
lsigAccount.lmsig = signature.lmsig
30+
return lsigAccount
31+
}
32+
33+
static fromBytes(encodedLsig: Uint8Array): LogicSigAccount {
34+
const decoded = decodeMsgpack(encodedLsig)
35+
const lsigSignature = logicSignatureCodec.decode(decoded, 'msgpack')
36+
return LogicSigAccount.fromSignature(lsigSignature)
37+
}
38+
5439
constructor(program: Uint8Array, programArgs?: Array<Uint8Array> | null) {
5540
if (programArgs && (!Array.isArray(programArgs) || !programArgs.every((arg) => arg.constructor === Uint8Array))) {
5641
throw new TypeError('Invalid arguments')
@@ -59,8 +44,6 @@ export class LogicSigAccount {
5944
let args: Uint8Array[] = []
6045
if (programArgs != null) args = programArgs.map((arg) => new Uint8Array(arg))
6146

62-
sanityCheckProgram(program)
63-
6447
this.logic = program
6548
this.args = args
6649
}
@@ -133,14 +116,3 @@ export class LogicSigAccount {
133116
return concatArrays(SIGN_PROGRAM_DATA_PREFIX, this.address().publicKey, data)
134117
}
135118
}
136-
137-
/**
138-
* Decodes MsgPack bytes into a logic signature.
139-
*
140-
* @param encodedLogicSignature - The MsgPack encoded logic signature
141-
* @returns The decoded LogicSignature or an error if decoding fails.
142-
*/
143-
export function decodeLogicSignature(encodedLogicSignature: Uint8Array): LogicSignature {
144-
const decodedData = decodeMsgpack(encodedLogicSignature)
145-
return logicSignatureCodec.decode(decodedData, 'msgpack')
146-
}

0 commit comments

Comments
 (0)