@layerzerolabs/test-utils-stellar 0.2.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +108 -0
- package/dist/4UKUSHEU.js +30 -0
- package/dist/4UKUSHEU.js.map +1 -0
- package/dist/7DZ4SVEO.js +46 -0
- package/dist/7DZ4SVEO.js.map +1 -0
- package/dist/CYINPPER.js +293 -0
- package/dist/CYINPPER.js.map +1 -0
- package/dist/DNRE4ENZ.js +56 -0
- package/dist/DNRE4ENZ.js.map +1 -0
- package/dist/GAGBEOCZ.js +25 -0
- package/dist/GAGBEOCZ.js.map +1 -0
- package/dist/PMDPSIA2.js +149 -0
- package/dist/PMDPSIA2.js.map +1 -0
- package/dist/TYAJMKGY.js +183 -0
- package/dist/TYAJMKGY.js.map +1 -0
- package/dist/VRABOZPX.js +364 -0
- package/dist/VRABOZPX.js.map +1 -0
- package/dist/VUOMXK5T.js +6 -0
- package/dist/VUOMXK5T.js.map +1 -0
- package/dist/ZWKXKZVT.js +394 -0
- package/dist/ZWKXKZVT.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +4 -0
- package/dist/client.js.map +1 -0
- package/dist/deploy.d.ts +43 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +4 -0
- package/dist/deploy.js.map +1 -0
- package/dist/env.d.ts +45 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +5 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/localnet-global-setup.d.ts +7 -0
- package/dist/localnet-global-setup.d.ts.map +1 -0
- package/dist/localnet-global-setup.js +6 -0
- package/dist/localnet-global-setup.js.map +1 -0
- package/dist/localnet.d.ts +37 -0
- package/dist/localnet.d.ts.map +1 -0
- package/dist/localnet.js +5 -0
- package/dist/localnet.js.map +1 -0
- package/dist/protocol-global-setup.d.ts +58 -0
- package/dist/protocol-global-setup.d.ts.map +1 -0
- package/dist/protocol-global-setup.js +7 -0
- package/dist/protocol-global-setup.js.map +1 -0
- package/dist/scan.d.ts +59 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +4 -0
- package/dist/scan.js.map +1 -0
- package/dist/secp256k1.d.ts +23 -0
- package/dist/secp256k1.d.ts.map +1 -0
- package/dist/secp256k1.js +4 -0
- package/dist/secp256k1.js.map +1 -0
- package/dist/utils.d.ts +54 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/package.json +50 -0
- package/src/client.ts +37 -0
- package/src/deploy.ts +316 -0
- package/src/env.ts +104 -0
- package/src/index.ts +40 -0
- package/src/localnet-global-setup.ts +30 -0
- package/src/localnet.ts +406 -0
- package/src/protocol-global-setup.ts +747 -0
- package/src/scan.ts +255 -0
- package/src/secp256k1.ts +59 -0
- package/src/utils.ts +642 -0
package/dist/GAGBEOCZ.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { __name } from './VUOMXK5T.js';
|
|
2
|
+
import { TransactionBuilder } from '@stellar/stellar-sdk';
|
|
3
|
+
|
|
4
|
+
function createClient(env, ClientClass, contractId, signer = env.DEFAULT_DEPLOYER) {
|
|
5
|
+
return new ClientClass({
|
|
6
|
+
contractId,
|
|
7
|
+
publicKey: signer.publicKey(),
|
|
8
|
+
signTransaction: /* @__PURE__ */ __name(async (tx) => {
|
|
9
|
+
const transaction = TransactionBuilder.fromXDR(tx, env.NETWORK_PASSPHRASE);
|
|
10
|
+
transaction.sign(signer);
|
|
11
|
+
return {
|
|
12
|
+
signedTxXdr: transaction.toXDR(),
|
|
13
|
+
signerAddress: signer.publicKey()
|
|
14
|
+
};
|
|
15
|
+
}, "signTransaction"),
|
|
16
|
+
rpcUrl: env.RPC_URL,
|
|
17
|
+
networkPassphrase: env.NETWORK_PASSPHRASE,
|
|
18
|
+
allowHttp: true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
__name(createClient, "createClient");
|
|
22
|
+
|
|
23
|
+
export { createClient };
|
|
24
|
+
//# sourceMappingURL=GAGBEOCZ.js.map
|
|
25
|
+
//# sourceMappingURL=GAGBEOCZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":["createClient","env","ClientClass","contractId","signer","DEFAULT_DEPLOYER","publicKey","signTransaction","tx","transaction","TransactionBuilder","fromXDR","NETWORK_PASSPHRASE","sign","signedTxXdr","toXDR","signerAddress","rpcUrl","RPC_URL","networkPassphrase","allowHttp"],"mappings":";;;AAQO,SAASA,aACZC,GAAAA,EACAC,WAAAA,EAQAC,UAAAA,EACAC,MAAAA,GAAkBH,IAAII,gBAAAA,EAAgB;AAEtC,EAAA,OAAO,IAAIH,WAAAA,CAAY;AACnBC,IAAAA,UAAAA;AACAG,IAAAA,SAAAA,EAAWF,OAAOE,SAAAA,EAAS;AAC3BC,IAAAA,eAAAA,gCAAwBC,EAAAA,KAAAA;AACpB,MAAA,MAAMC,WAAAA,GAAcC,kBAAAA,CAAmBC,OAAAA,CAAQH,EAAAA,EAAIP,IAAIW,kBAAkB,CAAA;AACzEH,MAAAA,WAAAA,CAAYI,KAAKT,MAAAA,CAAAA;AACjB,MAAA,OAAO;AACHU,QAAAA,WAAAA,EAAaL,YAAYM,KAAAA,EAAK;AAC9BC,QAAAA,aAAAA,EAAeZ,OAAOE,SAAAA;AAC1B,OAAA;IACJ,CAAA,EAPiB,iBAAA,CAAA;AAQjBW,IAAAA,MAAAA,EAAQhB,GAAAA,CAAIiB,OAAAA;AACZC,IAAAA,iBAAAA,EAAmBlB,GAAAA,CAAIW,kBAAAA;IACvBQ,SAAAA,EAAW;GACf,CAAA;AACJ;AA5BgBpB,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA","file":"GAGBEOCZ.js","sourcesContent":["import type { Keypair } from '@stellar/stellar-sdk';\nimport { TransactionBuilder } from '@stellar/stellar-sdk';\n\nimport type { StellarTestEnv } from './env.js';\n\n/**\n * Create a Soroban contract client with DEFAULT_DEPLOYER as signer.\n */\nexport function createClient<T>(\n env: StellarTestEnv,\n ClientClass: new (options: {\n contractId: string;\n publicKey: string;\n signTransaction: (tx: string) => Promise<{ signedTxXdr: string; signerAddress: string }>;\n rpcUrl: string;\n networkPassphrase: string;\n allowHttp: boolean;\n }) => T,\n contractId: string,\n signer: Keypair = env.DEFAULT_DEPLOYER,\n): T {\n return new ClientClass({\n contractId,\n publicKey: signer.publicKey(),\n signTransaction: async (tx: string) => {\n const transaction = TransactionBuilder.fromXDR(tx, env.NETWORK_PASSPHRASE);\n transaction.sign(signer);\n return {\n signedTxXdr: transaction.toXDR(),\n signerAddress: signer.publicKey(),\n };\n },\n rpcUrl: env.RPC_URL,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n allowHttp: true,\n });\n}\n"]}
|
package/dist/PMDPSIA2.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { __name } from './VUOMXK5T.js';
|
|
2
|
+
import { rpc, xdr } from '@stellar/stellar-sdk';
|
|
3
|
+
|
|
4
|
+
var DEFAULT_LEDGER_WAIT_ATTEMPTS = 10;
|
|
5
|
+
var DEFAULT_LEDGER_WAIT_DELAY_MS = 1e3;
|
|
6
|
+
function assertValidScanLedgerRange(startLedger, endLedger) {
|
|
7
|
+
if (endLedger <= startLedger) {
|
|
8
|
+
throw new Error(`Cannot scan events: localnet tip ${endLedger} did not advance past start ledger ${startLedger}. Calling getEvents with that range would fail (invalid / empty ledger window). The network is likely stalled or the transaction ledger was not yet closed.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
__name(assertValidScanLedgerRange, "assertValidScanLedgerRange");
|
|
12
|
+
async function resolveScanEndLedger(getLatestLedger, startLedgerSequence, options = {}) {
|
|
13
|
+
const maxAttempts = options.maxAttempts ?? DEFAULT_LEDGER_WAIT_ATTEMPTS;
|
|
14
|
+
const delayMs = options.delayMs ?? DEFAULT_LEDGER_WAIT_DELAY_MS;
|
|
15
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
16
|
+
let endLedger = (await getLatestLedger()).sequence;
|
|
17
|
+
if (endLedger > startLedgerSequence) {
|
|
18
|
+
return endLedger;
|
|
19
|
+
}
|
|
20
|
+
console.log(` Waiting for tip to advance past ledger ${startLedgerSequence} (current tip ${endLedger})...`);
|
|
21
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
22
|
+
await sleep(delayMs);
|
|
23
|
+
endLedger = (await getLatestLedger()).sequence;
|
|
24
|
+
if (endLedger > startLedgerSequence) {
|
|
25
|
+
return endLedger;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
assertValidScanLedgerRange(startLedgerSequence, endLedger);
|
|
29
|
+
return endLedger;
|
|
30
|
+
}
|
|
31
|
+
__name(resolveScanEndLedger, "resolveScanEndLedger");
|
|
32
|
+
async function scanEvents(env, startLedgerSequence, filter) {
|
|
33
|
+
const server = new rpc.Server(env.RPC_URL, {
|
|
34
|
+
allowHttp: true
|
|
35
|
+
});
|
|
36
|
+
console.log("\u{1F50D} Scanning events from ledger", startLedgerSequence);
|
|
37
|
+
try {
|
|
38
|
+
const endLedger = await resolveScanEndLedger(() => server.getLatestLedger(), startLedgerSequence);
|
|
39
|
+
const events = await server.getEvents({
|
|
40
|
+
startLedger: startLedgerSequence,
|
|
41
|
+
filters: [
|
|
42
|
+
{
|
|
43
|
+
type: "contract",
|
|
44
|
+
contractIds: [
|
|
45
|
+
filter.contractId
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
endLedger
|
|
50
|
+
});
|
|
51
|
+
const parsedEvents = [];
|
|
52
|
+
for (const event of events.events || []) {
|
|
53
|
+
try {
|
|
54
|
+
const parsedEvent = {
|
|
55
|
+
type: event.type,
|
|
56
|
+
contractId: event.contractId?.contractId() || "",
|
|
57
|
+
topics: event.topic,
|
|
58
|
+
data: event.value ? xdr.ScVal.fromXDR(event.value.toXDR()) : void 0,
|
|
59
|
+
ledger: event.ledger,
|
|
60
|
+
txHash: event.txHash
|
|
61
|
+
};
|
|
62
|
+
parsedEvents.push(parsedEvent);
|
|
63
|
+
} catch (e) {
|
|
64
|
+
console.warn("Failed to parse event:", e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
console.log(`\u2705 Found ${parsedEvents.length} events`);
|
|
68
|
+
return parsedEvents;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error("Error scanning events:", error.message);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
__name(scanEvents, "scanEvents");
|
|
75
|
+
async function scanPacketSentEvents(env, endpointAddress, startLedger) {
|
|
76
|
+
console.log("\u{1F4E6} Scanning for PacketSent events...");
|
|
77
|
+
const events = await scanEvents(env, startLedger, {
|
|
78
|
+
contractId: endpointAddress
|
|
79
|
+
});
|
|
80
|
+
const packetSentEvents = [];
|
|
81
|
+
for (const event of events) {
|
|
82
|
+
try {
|
|
83
|
+
const firstTopic = event.topics[0];
|
|
84
|
+
let eventName = "";
|
|
85
|
+
if (firstTopic && firstTopic._switch?.name === "scvSymbol") {
|
|
86
|
+
eventName = firstTopic.value()?.toString() || "";
|
|
87
|
+
}
|
|
88
|
+
if (eventName === "packet_sent") {
|
|
89
|
+
const eventData = event.data;
|
|
90
|
+
if (eventData && eventData._switch?.name === "scvMap") {
|
|
91
|
+
const map = eventData.value();
|
|
92
|
+
const packetEvent = {};
|
|
93
|
+
for (const entry of map || []) {
|
|
94
|
+
const key = entry.key().value()?.toString();
|
|
95
|
+
const value = entry.val();
|
|
96
|
+
if (key === "encoded_packet" && value._switch?.name === "scvBytes") {
|
|
97
|
+
packetEvent.encoded_packet = Buffer.from(value.value());
|
|
98
|
+
} else if (key === "options" && value._switch?.name === "scvBytes") {
|
|
99
|
+
packetEvent.options = Buffer.from(value.value());
|
|
100
|
+
} else if (key === "send_library" && value._switch?.name === "scvAddress") {
|
|
101
|
+
packetEvent.send_library = value.value()?.toString() || "";
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (packetEvent.encoded_packet && packetEvent.options !== void 0 && packetEvent.send_library) {
|
|
105
|
+
packetSentEvents.push(packetEvent);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} catch (e) {
|
|
110
|
+
console.warn("Failed to parse PacketSent event:", e);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
console.log(`\u2705 Found ${packetSentEvents.length} PacketSent events`);
|
|
114
|
+
return packetSentEvents;
|
|
115
|
+
}
|
|
116
|
+
__name(scanPacketSentEvents, "scanPacketSentEvents");
|
|
117
|
+
async function waitAndScanEvents(env, startLedger, contractAddress, eventName, maxWaitSeconds = 30) {
|
|
118
|
+
const server = new rpc.Server(env.RPC_URL, {
|
|
119
|
+
allowHttp: true
|
|
120
|
+
});
|
|
121
|
+
const endTime = Date.now() + maxWaitSeconds * 1e3;
|
|
122
|
+
console.log(`\u23F3 Waiting for ${eventName} events...`);
|
|
123
|
+
while (Date.now() < endTime) {
|
|
124
|
+
const currentLedger = await server.getLatestLedger();
|
|
125
|
+
if (currentLedger.sequence > startLedger) {
|
|
126
|
+
const events = await scanEvents(env, startLedger, {
|
|
127
|
+
contractId: contractAddress
|
|
128
|
+
});
|
|
129
|
+
const matchingEvents = events.filter((e) => {
|
|
130
|
+
const firstTopic = e.topics[0];
|
|
131
|
+
if (firstTopic && firstTopic._switch?.name === "scvSymbol") {
|
|
132
|
+
const name = firstTopic.value()?.toString() || "";
|
|
133
|
+
return name === eventName;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
});
|
|
137
|
+
if (matchingEvents.length > 0) {
|
|
138
|
+
return matchingEvents;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
142
|
+
}
|
|
143
|
+
throw new Error(`Timeout waiting for ${eventName} events`);
|
|
144
|
+
}
|
|
145
|
+
__name(waitAndScanEvents, "waitAndScanEvents");
|
|
146
|
+
|
|
147
|
+
export { DEFAULT_LEDGER_WAIT_ATTEMPTS, DEFAULT_LEDGER_WAIT_DELAY_MS, assertValidScanLedgerRange, resolveScanEndLedger, scanEvents, scanPacketSentEvents, waitAndScanEvents };
|
|
148
|
+
//# sourceMappingURL=PMDPSIA2.js.map
|
|
149
|
+
//# sourceMappingURL=PMDPSIA2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scan.ts"],"names":["DEFAULT_LEDGER_WAIT_ATTEMPTS","DEFAULT_LEDGER_WAIT_DELAY_MS","assertValidScanLedgerRange","startLedger","endLedger","Error","resolveScanEndLedger","getLatestLedger","startLedgerSequence","options","maxAttempts","delayMs","sleep","ms","Promise","resolve","setTimeout","sequence","console","log","attempt","scanEvents","env","filter","server","rpc","Server","RPC_URL","allowHttp","events","getEvents","filters","type","contractIds","contractId","parsedEvents","event","parsedEvent","topics","topic","data","value","xdr","ScVal","fromXDR","toXDR","undefined","ledger","txHash","push","e","warn","length","error","message","scanPacketSentEvents","endpointAddress","packetSentEvents","firstTopic","eventName","_switch","name","toString","eventData","map","packetEvent","entry","key","val","encoded_packet","Buffer","from","send_library","waitAndScanEvents","contractAddress","maxWaitSeconds","endTime","Date","now","currentLedger","matchingEvents"],"mappings":"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","file":"PMDPSIA2.js","sourcesContent":["import { rpc, xdr } from '@stellar/stellar-sdk';\n\nimport type { StellarTestEnv } from './env.js';\n\n/**\n * Event filter for scanning contract events\n */\nexport interface EventFilter {\n contractId: string;\n}\n\n/**\n * Parsed contract event\n */\nexport interface ParsedContractEvent {\n type: string;\n contractId: string;\n topics: any[];\n data: any;\n ledger: number;\n txHash: string;\n}\n\n/**\n * PacketSent event structure from endpoint_v2.rs\n */\nexport interface PacketSentEvent {\n encoded_packet: Buffer;\n options: Buffer;\n send_library: string;\n}\n\nexport const DEFAULT_LEDGER_WAIT_ATTEMPTS = 10;\nexport const DEFAULT_LEDGER_WAIT_DELAY_MS = 1000;\n\nexport type LatestLedgerReader = () => Promise<{ sequence: number }>;\n\nexport interface ResolveScanEndLedgerOptions {\n maxAttempts?: number;\n delayMs?: number;\n sleep?: (ms: number) => Promise<void>;\n}\n\n/**\n * RPC `getEvents` rejects ranges where start is past the tip, and treats end as\n * exclusive in practice. Require tip strictly greater than the scan start ledger.\n */\nexport function assertValidScanLedgerRange(startLedger: number, endLedger: number): void {\n if (endLedger <= startLedger) {\n throw new Error(\n `Cannot scan events: localnet tip ${endLedger} did not advance past start ledger ${startLedger}. ` +\n `Calling getEvents with that range would fail (invalid / empty ledger window). ` +\n `The network is likely stalled or the transaction ledger was not yet closed.`,\n );\n }\n}\n\n/**\n * Ensure latest ledger is strictly after `startLedgerSequence` before scanning.\n * Returns the tip to use as `endLedger`.\n */\nexport async function resolveScanEndLedger(\n getLatestLedger: LatestLedgerReader,\n startLedgerSequence: number,\n options: ResolveScanEndLedgerOptions = {},\n): Promise<number> {\n const maxAttempts = options.maxAttempts ?? DEFAULT_LEDGER_WAIT_ATTEMPTS;\n const delayMs = options.delayMs ?? DEFAULT_LEDGER_WAIT_DELAY_MS;\n const sleep =\n options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n let endLedger = (await getLatestLedger()).sequence;\n if (endLedger > startLedgerSequence) {\n return endLedger;\n }\n\n console.log(\n ` Waiting for tip to advance past ledger ${startLedgerSequence} (current tip ${endLedger})...`,\n );\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await sleep(delayMs);\n endLedger = (await getLatestLedger()).sequence;\n if (endLedger > startLedgerSequence) {\n return endLedger;\n }\n }\n\n // Fail closed: do not call getEvents with start >= tip (invalid / empty window).\n assertValidScanLedgerRange(startLedgerSequence, endLedger);\n return endLedger;\n}\n\n/**\n * Scan for contract events within a ledger range\n */\nexport async function scanEvents(\n env: StellarTestEnv,\n startLedgerSequence: number,\n filter: EventFilter,\n): Promise<ParsedContractEvent[]> {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n\n console.log('🔍 Scanning events from ledger', startLedgerSequence);\n\n try {\n const endLedger = await resolveScanEndLedger(\n () => server.getLatestLedger(),\n startLedgerSequence,\n );\n\n const events = await server.getEvents({\n startLedger: startLedgerSequence,\n filters: [{ type: 'contract', contractIds: [filter.contractId] }],\n endLedger: endLedger,\n });\n\n const parsedEvents: ParsedContractEvent[] = [];\n\n for (const event of events.events || []) {\n try {\n const parsedEvent: ParsedContractEvent = {\n type: event.type,\n contractId: event.contractId?.contractId() || '',\n topics: event.topic,\n data: event.value ? xdr.ScVal.fromXDR(event.value.toXDR()) : undefined,\n ledger: event.ledger,\n txHash: event.txHash,\n };\n parsedEvents.push(parsedEvent);\n } catch (e) {\n console.warn('Failed to parse event:', e);\n }\n }\n\n console.log(`✅ Found ${parsedEvents.length} events`);\n return parsedEvents;\n } catch (error: any) {\n console.error('Error scanning events:', error.message);\n throw error;\n }\n}\n\n/**\n * Scan for PacketSent events from the Endpoint contract\n */\nexport async function scanPacketSentEvents(\n env: StellarTestEnv,\n endpointAddress: string,\n startLedger: number,\n): Promise<PacketSentEvent[]> {\n console.log('📦 Scanning for PacketSent events...');\n const events = await scanEvents(env, startLedger, {\n contractId: endpointAddress,\n });\n\n // Filter for PacketSent events\n // PacketSent event has topics like [\"PacketSent\"] or similar\n const packetSentEvents: PacketSentEvent[] = [];\n\n for (const event of events) {\n try {\n // Check if this is a PacketSent event\n // The first topic should be the event name\n const firstTopic = event.topics[0];\n\n // Convert ScVal to string to check event name\n let eventName = '';\n if (firstTopic && firstTopic._switch?.name === 'scvSymbol') {\n eventName = firstTopic.value()?.toString() || '';\n }\n\n if (eventName === 'packet_sent') {\n // Parse the event data\n // PacketSent { encoded_packet, options, send_library }\n const eventData = event.data;\n\n // Try to extract fields from the struct\n if (eventData && eventData._switch?.name === 'scvMap') {\n const map = eventData.value();\n const packetEvent: Partial<PacketSentEvent> = {};\n\n for (const entry of map || []) {\n const key = entry.key().value()?.toString();\n const value = entry.val();\n\n if (key === 'encoded_packet' && value._switch?.name === 'scvBytes') {\n packetEvent.encoded_packet = Buffer.from(value.value());\n } else if (key === 'options' && value._switch?.name === 'scvBytes') {\n packetEvent.options = Buffer.from(value.value());\n } else if (key === 'send_library' && value._switch?.name === 'scvAddress') {\n packetEvent.send_library = value.value()?.toString() || '';\n }\n }\n\n if (\n packetEvent.encoded_packet &&\n packetEvent.options !== undefined &&\n packetEvent.send_library\n ) {\n packetSentEvents.push(packetEvent as PacketSentEvent);\n }\n }\n }\n } catch (e) {\n console.warn('Failed to parse PacketSent event:', e);\n }\n }\n\n console.log(`✅ Found ${packetSentEvents.length} PacketSent events`);\n return packetSentEvents;\n}\n\n/**\n * Wait for new ledgers and scan for events\n */\nexport async function waitAndScanEvents(\n env: StellarTestEnv,\n startLedger: number,\n contractAddress: string,\n eventName: string,\n maxWaitSeconds: number = 30,\n): Promise<ParsedContractEvent[]> {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n const endTime = Date.now() + maxWaitSeconds * 1000;\n\n console.log(`⏳ Waiting for ${eventName} events...`);\n\n while (Date.now() < endTime) {\n const currentLedger = await server.getLatestLedger();\n\n if (currentLedger.sequence > startLedger) {\n const events = await scanEvents(env, startLedger, {\n contractId: contractAddress,\n });\n\n const matchingEvents = events.filter((e) => {\n const firstTopic = e.topics[0];\n if (firstTopic && firstTopic._switch?.name === 'scvSymbol') {\n const name = firstTopic.value()?.toString() || '';\n return name === eventName;\n }\n return false;\n });\n\n if (matchingEvents.length > 0) {\n return matchingEvents;\n }\n }\n\n // Wait 1 second before checking again\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n throw new Error(`Timeout waiting for ${eventName} events`);\n}\n"]}
|
package/dist/TYAJMKGY.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { __name } from './VUOMXK5T.js';
|
|
2
|
+
import { xdr, TransactionBuilder, BASE_FEE, Operation, rpc, hash, Asset } from '@stellar/stellar-sdk';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
|
|
5
|
+
async function queryWasmTtl(env, wasmHash, server) {
|
|
6
|
+
try {
|
|
7
|
+
const latestLedger = await server.getLatestLedger();
|
|
8
|
+
const currentLedger = latestLedger.sequence;
|
|
9
|
+
const wasmHashBuffer = Buffer.from(wasmHash, "hex");
|
|
10
|
+
const hashBytes = wasmHashBuffer.length === 32 ? wasmHashBuffer : wasmHashBuffer.slice(0, 32);
|
|
11
|
+
const ledgerKeyContractCode = new xdr.LedgerKeyContractCode({
|
|
12
|
+
hash: hashBytes
|
|
13
|
+
});
|
|
14
|
+
const ledgerKey = xdr.LedgerKey.contractCode(ledgerKeyContractCode);
|
|
15
|
+
const ledgerKeyXdr = ledgerKey.toXDR("base64");
|
|
16
|
+
const response = await fetch(env.RPC_URL, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: {
|
|
19
|
+
"Content-Type": "application/json"
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
jsonrpc: "2.0",
|
|
23
|
+
id: 1,
|
|
24
|
+
method: "getLedgerEntries",
|
|
25
|
+
params: {
|
|
26
|
+
keys: [
|
|
27
|
+
ledgerKeyXdr
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
const result = await response.json();
|
|
33
|
+
if (result.error) {
|
|
34
|
+
console.warn(`Warning: Could not retrieve WASM TTL: ${result.error.message}`);
|
|
35
|
+
} else if (result.result?.entries?.[0]?.liveUntilLedgerSeq) {
|
|
36
|
+
const liveUntilLedgerSeq = result.result.entries[0].liveUntilLedgerSeq;
|
|
37
|
+
const ttlLedgers = liveUntilLedgerSeq - currentLedger;
|
|
38
|
+
const ttlDays = ttlLedgers * 5 / (24 * 3600);
|
|
39
|
+
console.log(`\u23F0 WASM TTL: live until ledger ${liveUntilLedgerSeq} (${ttlLedgers} ledgers remaining, ~${ttlDays.toFixed(2)} days)`);
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.warn(`Warning: Could not retrieve WASM TTL: ${error instanceof Error ? error.message : String(error)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
__name(queryWasmTtl, "queryWasmTtl");
|
|
46
|
+
async function uploadWasm(env, wasmBuffer, keypair, server) {
|
|
47
|
+
console.log(`\u{1F4E6} WASM buffer size: ${wasmBuffer.length} bytes (${(wasmBuffer.length / 1024).toFixed(2)} KB)`);
|
|
48
|
+
const account = await server.getAccount(keypair.publicKey());
|
|
49
|
+
const uploadTx = new TransactionBuilder(account, {
|
|
50
|
+
fee: BASE_FEE,
|
|
51
|
+
networkPassphrase: env.NETWORK_PASSPHRASE
|
|
52
|
+
}).addOperation(Operation.uploadContractWasm({
|
|
53
|
+
wasm: wasmBuffer
|
|
54
|
+
})).setTimeout(30).build();
|
|
55
|
+
const simulated = await server.simulateTransaction(uploadTx);
|
|
56
|
+
const preparedTx = rpc.assembleTransaction(uploadTx, simulated).build();
|
|
57
|
+
console.log(`\u{1F4B0} Upload transaction fee: ${preparedTx.fee} stroops (${(Number(preparedTx.fee) / 1e7).toFixed(7)} XLM)`);
|
|
58
|
+
preparedTx.sign(keypair);
|
|
59
|
+
const sendResult = await server.sendTransaction(preparedTx);
|
|
60
|
+
if (sendResult.status !== "PENDING") {
|
|
61
|
+
throw new Error(`Transaction failed: ${JSON.stringify(sendResult)}`);
|
|
62
|
+
}
|
|
63
|
+
const txResult = await server.pollTransaction(sendResult.hash);
|
|
64
|
+
if (txResult.status !== "SUCCESS") {
|
|
65
|
+
throw new Error(`Transaction not successful: ${JSON.stringify(txResult)}`);
|
|
66
|
+
}
|
|
67
|
+
const wasmHash = hash(wasmBuffer).toString("hex");
|
|
68
|
+
await queryWasmTtl(env, wasmHash, server);
|
|
69
|
+
return wasmHash;
|
|
70
|
+
}
|
|
71
|
+
__name(uploadWasm, "uploadWasm");
|
|
72
|
+
async function deployContract(env, ClientClass, wasmFilePath, constructorArgs, deployer, options = {}) {
|
|
73
|
+
const { rpcUrl = env.RPC_URL, networkPassphrase = env.NETWORK_PASSPHRASE, allowHttp = true, salt } = options;
|
|
74
|
+
const server = new rpc.Server(rpcUrl, {
|
|
75
|
+
allowHttp
|
|
76
|
+
});
|
|
77
|
+
let wasmHash = options.wasmHash;
|
|
78
|
+
if (wasmHash) {
|
|
79
|
+
console.log("\u{1F4E6} Using pre-uploaded WASM hash:", wasmHash);
|
|
80
|
+
} else {
|
|
81
|
+
console.log("\u{1F4D6} Reading WASM file from:", wasmFilePath);
|
|
82
|
+
const wasmBuffer = readFileSync(wasmFilePath);
|
|
83
|
+
console.log("\u{1F4E4} Uploading WASM...");
|
|
84
|
+
wasmHash = await uploadWasm(env, wasmBuffer, deployer, server);
|
|
85
|
+
console.log("\u2705 WASM uploaded, hash:", wasmHash);
|
|
86
|
+
}
|
|
87
|
+
console.log("\u{1F680} Deploying contract...");
|
|
88
|
+
const deployOptions = {
|
|
89
|
+
wasmHash,
|
|
90
|
+
publicKey: deployer.publicKey(),
|
|
91
|
+
signTransaction: /* @__PURE__ */ __name(async (tx) => {
|
|
92
|
+
const transaction = TransactionBuilder.fromXDR(tx, networkPassphrase);
|
|
93
|
+
transaction.sign(deployer);
|
|
94
|
+
return {
|
|
95
|
+
signedTxXdr: transaction.toXDR(),
|
|
96
|
+
signerAddress: deployer.publicKey()
|
|
97
|
+
};
|
|
98
|
+
}, "signTransaction"),
|
|
99
|
+
rpcUrl,
|
|
100
|
+
networkPassphrase,
|
|
101
|
+
allowHttp,
|
|
102
|
+
salt
|
|
103
|
+
};
|
|
104
|
+
const deployTx = constructorArgs == null ? await ClientClass.deploy(deployOptions) : await ClientClass.deploy(constructorArgs, deployOptions);
|
|
105
|
+
const sentTx = await deployTx.signAndSend();
|
|
106
|
+
const contractClient = sentTx.result;
|
|
107
|
+
const contractId = contractClient.options.contractId;
|
|
108
|
+
console.log("\u2705 Contract deployed at:", contractId);
|
|
109
|
+
return contractClient;
|
|
110
|
+
}
|
|
111
|
+
__name(deployContract, "deployContract");
|
|
112
|
+
async function deployNativeSac(env) {
|
|
113
|
+
await deployAssetSac(env, Asset.native());
|
|
114
|
+
console.log("\u2705 Native SAC deployed");
|
|
115
|
+
}
|
|
116
|
+
__name(deployNativeSac, "deployNativeSac");
|
|
117
|
+
async function deployZroToken(env) {
|
|
118
|
+
const server = new rpc.Server(env.RPC_URL, {
|
|
119
|
+
allowHttp: true
|
|
120
|
+
});
|
|
121
|
+
const account = await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());
|
|
122
|
+
const transaction = new TransactionBuilder(account, {
|
|
123
|
+
fee: BASE_FEE,
|
|
124
|
+
networkPassphrase: env.NETWORK_PASSPHRASE
|
|
125
|
+
}).addOperation(Operation.changeTrust({
|
|
126
|
+
asset: env.ZRO_ASSET,
|
|
127
|
+
source: env.ZRO_DISTRIBUTOR.publicKey()
|
|
128
|
+
})).addOperation(Operation.payment({
|
|
129
|
+
asset: env.ZRO_ASSET,
|
|
130
|
+
amount: "10000",
|
|
131
|
+
destination: env.ZRO_DISTRIBUTOR.publicKey()
|
|
132
|
+
})).setTimeout(10).build();
|
|
133
|
+
transaction.sign(env.DEFAULT_DEPLOYER, env.ZRO_DISTRIBUTOR);
|
|
134
|
+
const sendResult = await server.sendTransaction(transaction);
|
|
135
|
+
if (sendResult.status !== "PENDING") {
|
|
136
|
+
throw new Error(`Failed to issue ZRO token: ${JSON.stringify(sendResult)}`);
|
|
137
|
+
}
|
|
138
|
+
const txResult = await server.pollTransaction(sendResult.hash);
|
|
139
|
+
if (txResult.status !== "SUCCESS") {
|
|
140
|
+
throw new Error(`Failed to issue ZRO token: ${JSON.stringify(txResult)}`);
|
|
141
|
+
}
|
|
142
|
+
console.log("\u2705 ZRO asset issued");
|
|
143
|
+
await deployAssetSac(env, env.ZRO_ASSET);
|
|
144
|
+
console.log("\u2705 ZRO SAC deployed");
|
|
145
|
+
}
|
|
146
|
+
__name(deployZroToken, "deployZroToken");
|
|
147
|
+
async function deployAssetSac(env, asset) {
|
|
148
|
+
console.log("Deploying SAC for asset:", asset.toString());
|
|
149
|
+
const server = new rpc.Server(env.RPC_URL, {
|
|
150
|
+
allowHttp: true
|
|
151
|
+
});
|
|
152
|
+
const account = await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());
|
|
153
|
+
const deployTx = new TransactionBuilder(account, {
|
|
154
|
+
fee: BASE_FEE,
|
|
155
|
+
networkPassphrase: env.NETWORK_PASSPHRASE
|
|
156
|
+
}).addOperation(Operation.createStellarAssetContract({
|
|
157
|
+
asset
|
|
158
|
+
})).setTimeout(30).build();
|
|
159
|
+
const simulated = await server.simulateTransaction(deployTx);
|
|
160
|
+
if (rpc.Api.isSimulationError(simulated)) {
|
|
161
|
+
if (simulated.error?.includes("ExistingValue")) {
|
|
162
|
+
console.log(`SAC for ${asset.toString()} already deployed, skipping`);
|
|
163
|
+
return asset.contractId(env.NETWORK_PASSPHRASE);
|
|
164
|
+
}
|
|
165
|
+
throw new Error(`Transaction simulation failed: ${JSON.stringify(simulated)}`);
|
|
166
|
+
}
|
|
167
|
+
const preparedTx = rpc.assembleTransaction(deployTx, simulated).build();
|
|
168
|
+
preparedTx.sign(env.DEFAULT_DEPLOYER);
|
|
169
|
+
const sendResult = await server.sendTransaction(preparedTx);
|
|
170
|
+
if (sendResult.status !== "PENDING") {
|
|
171
|
+
throw new Error(`Failed to deploy SAC: ${JSON.stringify(sendResult)}`);
|
|
172
|
+
}
|
|
173
|
+
const txResult = await server.pollTransaction(sendResult.hash);
|
|
174
|
+
if (txResult.status !== "SUCCESS") {
|
|
175
|
+
throw new Error(`SAC deployment not successful: ${JSON.stringify(txResult)}`);
|
|
176
|
+
}
|
|
177
|
+
return asset.contractId(env.NETWORK_PASSPHRASE);
|
|
178
|
+
}
|
|
179
|
+
__name(deployAssetSac, "deployAssetSac");
|
|
180
|
+
|
|
181
|
+
export { deployAssetSac, deployContract, deployNativeSac, deployZroToken, uploadWasm };
|
|
182
|
+
//# sourceMappingURL=TYAJMKGY.js.map
|
|
183
|
+
//# sourceMappingURL=TYAJMKGY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deploy.ts"],"names":["queryWasmTtl","env","wasmHash","server","latestLedger","getLatestLedger","currentLedger","sequence","wasmHashBuffer","Buffer","from","hashBytes","length","slice","ledgerKeyContractCode","xdr","LedgerKeyContractCode","hash","ledgerKey","LedgerKey","contractCode","ledgerKeyXdr","toXDR","response","fetch","RPC_URL","method","headers","body","JSON","stringify","jsonrpc","id","params","keys","result","json","error","console","warn","message","entries","liveUntilLedgerSeq","ttlLedgers","ttlDays","log","toFixed","Error","String","uploadWasm","wasmBuffer","keypair","account","getAccount","publicKey","uploadTx","TransactionBuilder","fee","BASE_FEE","networkPassphrase","NETWORK_PASSPHRASE","addOperation","Operation","uploadContractWasm","wasm","setTimeout","build","simulated","simulateTransaction","preparedTx","rpc","assembleTransaction","Number","sign","sendResult","sendTransaction","status","txResult","pollTransaction","toString","deployContract","ClientClass","wasmFilePath","constructorArgs","deployer","options","rpcUrl","allowHttp","salt","Server","readFileSync","deployOptions","signTransaction","tx","transaction","fromXDR","signedTxXdr","signerAddress","deployTx","deploy","sentTx","signAndSend","contractClient","contractId","deployNativeSac","deployAssetSac","Asset","native","deployZroToken","DEFAULT_DEPLOYER","changeTrust","asset","ZRO_ASSET","source","ZRO_DISTRIBUTOR","payment","amount","destination","createStellarAssetContract","Api","isSimulationError","includes"],"mappings":"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","file":"TYAJMKGY.js","sourcesContent":["import type { Keypair } from '@stellar/stellar-sdk';\nimport {\n Asset,\n BASE_FEE,\n hash,\n Operation,\n rpc,\n TransactionBuilder,\n xdr,\n} from '@stellar/stellar-sdk';\nimport { readFileSync } from 'fs';\n\nimport type { StellarTestEnv } from './env.js';\n\nexport interface DeployableContractClient<T extends { options: { contractId: string } }> {\n deploy: (\n argsOrOptions: unknown,\n options?: unknown,\n ) => Promise<{ signAndSend: () => Promise<{ result: T }> }>;\n}\n\n/**\n * Query and display the TTL (Time To Live) of uploaded WASM code.\n *\n * @param env - Stellar test environment (RPC URL, etc.)\n * @param wasmHash - The hex-encoded SHA-256 hash of the WASM code\n * @param server - The Stellar RPC server instance\n */\nasync function queryWasmTtl(\n env: StellarTestEnv,\n wasmHash: string,\n server: rpc.Server,\n): Promise<void> {\n try {\n const latestLedger = await server.getLatestLedger();\n const currentLedger = latestLedger.sequence;\n\n // Create the LedgerKey for contract code using XDR encoding\n const wasmHashBuffer = Buffer.from(wasmHash, 'hex');\n // Ensure hash is exactly 32 bytes\n const hashBytes =\n wasmHashBuffer.length === 32 ? wasmHashBuffer : wasmHashBuffer.slice(0, 32);\n // Create LedgerKeyContractCode with hash\n const ledgerKeyContractCode = new xdr.LedgerKeyContractCode({\n hash: hashBytes,\n });\n const ledgerKey = xdr.LedgerKey.contractCode(ledgerKeyContractCode);\n const ledgerKeyXdr = ledgerKey.toXDR('base64');\n\n // Query contract code entry using direct RPC call\n const response = await fetch(env.RPC_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getLedgerEntries',\n params: {\n keys: [ledgerKeyXdr],\n },\n }),\n });\n\n const result = (await response.json()) as any;\n if (result.error) {\n console.warn(`Warning: Could not retrieve WASM TTL: ${result.error.message}`);\n } else if (result.result?.entries?.[0]?.liveUntilLedgerSeq) {\n const liveUntilLedgerSeq = result.result.entries[0].liveUntilLedgerSeq;\n const ttlLedgers = liveUntilLedgerSeq - currentLedger;\n const ttlDays = (ttlLedgers * 5) / (24 * 3600); // ~5 seconds per ledger\n console.log(\n `⏰ WASM TTL: live until ledger ${liveUntilLedgerSeq} (${ttlLedgers} ledgers remaining, ~${ttlDays.toFixed(2)} days)`,\n );\n }\n } catch (error) {\n // If querying TTL fails, it might be because the code isn't indexed yet\n // This is non-fatal, so we just log a warning\n console.warn(\n `Warning: Could not retrieve WASM TTL: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport async function uploadWasm(\n env: StellarTestEnv,\n wasmBuffer: Buffer,\n keypair: Keypair,\n server: rpc.Server,\n): Promise<string> {\n console.log(\n `📦 WASM buffer size: ${wasmBuffer.length} bytes (${(wasmBuffer.length / 1024).toFixed(2)} KB)`,\n );\n\n const account = await server.getAccount(keypair.publicKey());\n\n const uploadTx = new TransactionBuilder(account, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(Operation.uploadContractWasm({ wasm: wasmBuffer }))\n .setTimeout(30)\n .build();\n\n const simulated = await server.simulateTransaction(uploadTx);\n const preparedTx = rpc.assembleTransaction(uploadTx, simulated).build();\n\n console.log(\n `💰 Upload transaction fee: ${preparedTx.fee} stroops (${(Number(preparedTx.fee) / 10000000).toFixed(7)} XLM)`,\n );\n\n preparedTx.sign(keypair);\n\n const sendResult = await server.sendTransaction(preparedTx);\n\n if (sendResult.status !== 'PENDING') {\n throw new Error(`Transaction failed: ${JSON.stringify(sendResult)}`);\n }\n\n // Wait for transaction to be confirmed\n const txResult = await server.pollTransaction(sendResult.hash);\n\n if (txResult.status !== 'SUCCESS') {\n throw new Error(`Transaction not successful: ${JSON.stringify(txResult)}`);\n }\n\n // Compute the WASM hash (SHA-256 of the WASM bytes)\n const wasmHash = hash(wasmBuffer).toString('hex');\n\n // Query and display the WASM code TTL\n await queryWasmTtl(env, wasmHash, server);\n\n return wasmHash;\n}\n\n/**\n * Generic contract deployment helper that works with any contract Client\n *\n * @param ClientClass - The contract Client class (e.g., EndpointClient, SMLClient)\n * @param wasmFilePath - Path to the compiled WASM file\n * @param constructorArgs - Arguments for the contract's constructor\n * @param deployer - The keypair that will deploy the contract\n * @param options - Optional deployment options (salt, fee, timeout, etc.)\n * @returns The deployed contract's Client instance with the contractId\n */\nexport async function deployContract<T extends { options: { contractId: string } }>(\n env: StellarTestEnv,\n ClientClass: DeployableContractClient<T>,\n wasmFilePath: string,\n constructorArgs: unknown,\n deployer: Keypair,\n options: {\n salt?: Buffer;\n wasmHash?: string;\n rpcUrl?: string;\n networkPassphrase?: string;\n allowHttp?: boolean;\n } = {},\n): Promise<T> {\n const {\n rpcUrl = env.RPC_URL,\n networkPassphrase = env.NETWORK_PASSPHRASE,\n allowHttp = true,\n salt,\n } = options;\n\n const server = new rpc.Server(rpcUrl, {\n allowHttp: allowHttp,\n });\n\n let wasmHash = options.wasmHash;\n if (wasmHash) {\n console.log('📦 Using pre-uploaded WASM hash:', wasmHash);\n } else {\n // Step 1: Read WASM file\n console.log('📖 Reading WASM file from:', wasmFilePath);\n const wasmBuffer = readFileSync(wasmFilePath);\n\n // Step 2: Upload WASM and get hash\n console.log('📤 Uploading WASM...');\n wasmHash = await uploadWasm(env, wasmBuffer, deployer, server);\n console.log('✅ WASM uploaded, hash:', wasmHash);\n }\n\n // Step 3: Deploy the contract\n console.log('🚀 Deploying contract...');\n const deployOptions = {\n wasmHash,\n publicKey: deployer.publicKey(),\n signTransaction: async (tx: string) => {\n const transaction = TransactionBuilder.fromXDR(tx, networkPassphrase);\n transaction.sign(deployer);\n return {\n signedTxXdr: transaction.toXDR(),\n signerAddress: deployer.publicKey(),\n };\n },\n rpcUrl,\n networkPassphrase,\n allowHttp,\n salt,\n };\n const deployTx =\n constructorArgs == null\n ? await ClientClass.deploy(deployOptions)\n : await ClientClass.deploy(constructorArgs, deployOptions);\n\n // Step 4: Sign and send\n const sentTx = await deployTx.signAndSend();\n\n // Step 5: Extract contract ID from result\n const contractClient = sentTx.result;\n const contractId = contractClient.options.contractId;\n console.log('✅ Contract deployed at:', contractId);\n\n return contractClient;\n}\n\nexport async function deployNativeSac(env: StellarTestEnv): Promise<void> {\n await deployAssetSac(env, Asset.native());\n console.log('✅ Native SAC deployed');\n}\n\nexport async function deployZroToken(env: StellarTestEnv): Promise<void> {\n const server = new rpc.Server(env.RPC_URL, {\n allowHttp: true,\n });\n\n // First, issue the ZRO token.\n // We can't changeTrust of Issuer account, because the Issuer can't hold the asset.\n const account = await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());\n const transaction = new TransactionBuilder(account, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.changeTrust({\n asset: env.ZRO_ASSET,\n source: env.ZRO_DISTRIBUTOR.publicKey(),\n }),\n )\n .addOperation(\n Operation.payment({\n asset: env.ZRO_ASSET,\n amount: '10000',\n destination: env.ZRO_DISTRIBUTOR.publicKey(),\n }),\n )\n .setTimeout(10)\n .build();\n transaction.sign(env.DEFAULT_DEPLOYER, env.ZRO_DISTRIBUTOR);\n\n const sendResult = await server.sendTransaction(transaction);\n if (sendResult.status !== 'PENDING') {\n throw new Error(`Failed to issue ZRO token: ${JSON.stringify(sendResult)}`);\n }\n const txResult = await server.pollTransaction(sendResult.hash);\n if (txResult.status !== 'SUCCESS') {\n throw new Error(`Failed to issue ZRO token: ${JSON.stringify(txResult)}`);\n }\n console.log('✅ ZRO asset issued');\n\n // Deploy the Stellar Asset Contract (SAC)\n await deployAssetSac(env, env.ZRO_ASSET);\n console.log('✅ ZRO SAC deployed');\n}\n\n/**\n * Deploy SAC for a custom asset using TypeScript\n */\nexport async function deployAssetSac(env: StellarTestEnv, asset: Asset): Promise<string> {\n console.log('Deploying SAC for asset:', asset.toString());\n\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n const account = await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());\n\n // Build transaction with createStellarAssetContract operation\n const deployTx = new TransactionBuilder(account, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.createStellarAssetContract({\n asset: asset,\n }),\n )\n .setTimeout(30)\n .build();\n\n // Simulate transaction first (required for contract operations)\n const simulated = await server.simulateTransaction(deployTx);\n\n // Check if simulation was successful\n if (rpc.Api.isSimulationError(simulated)) {\n // Soroban returns ExistingValue when the contract is already deployed.\n // This is expected on container reuse (local dev reruns).\n if (simulated.error?.includes('ExistingValue')) {\n console.log(`SAC for ${asset.toString()} already deployed, skipping`);\n return asset.contractId(env.NETWORK_PASSPHRASE);\n }\n throw new Error(`Transaction simulation failed: ${JSON.stringify(simulated)}`);\n }\n\n const preparedTx = rpc.assembleTransaction(deployTx, simulated).build();\n\n // Sign and send\n preparedTx.sign(env.DEFAULT_DEPLOYER);\n const sendResult = await server.sendTransaction(preparedTx);\n if (sendResult.status !== 'PENDING') {\n throw new Error(`Failed to deploy SAC: ${JSON.stringify(sendResult)}`);\n }\n const txResult = await server.pollTransaction(sendResult.hash);\n if (txResult.status !== 'SUCCESS') {\n throw new Error(`SAC deployment not successful: ${JSON.stringify(txResult)}`);\n }\n return asset.contractId(env.NETWORK_PASSPHRASE);\n}\n"]}
|