@layerzerolabs/protocol-stellar-v2 0.2.29 → 0.2.30

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.
Files changed (205) hide show
  1. package/.turbo/turbo-build.log +371 -321
  2. package/.turbo/turbo-lint.log +211 -202
  3. package/.turbo/turbo-test.log +1766 -1673
  4. package/Cargo.lock +11 -1
  5. package/contracts/common-macros/src/lib.rs +0 -2
  6. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +1 -0
  7. package/contracts/endpoint-v2/src/messaging_channel.rs +32 -3
  8. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +1 -1
  9. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +1 -1
  10. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +6 -6
  11. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +1 -1
  12. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +16 -10
  13. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +10 -10
  14. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +3 -3
  15. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +4 -3
  16. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +1 -57
  17. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +0 -30
  18. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -3
  19. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +6 -4
  20. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -3
  21. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -3
  22. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +0 -30
  23. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +0 -30
  24. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +0 -2
  25. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +0 -2
  26. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +0 -2
  27. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +1 -3
  28. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +3 -6
  29. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +10 -0
  30. package/contracts/message-libs/message-lib-common/src/worker_options.rs +6 -2
  31. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +3 -3
  32. package/contracts/message-libs/treasury/src/lib.rs +2 -1
  33. package/contracts/message-libs/treasury/src/tests/setup.rs +1 -1
  34. package/contracts/message-libs/treasury/src/treasury.rs +5 -2
  35. package/contracts/message-libs/uln-302/src/errors.rs +2 -0
  36. package/contracts/message-libs/uln-302/src/events.rs +3 -3
  37. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +8 -0
  38. package/contracts/message-libs/uln-302/src/lib.rs +2 -1
  39. package/contracts/message-libs/uln-302/src/receive_uln.rs +16 -13
  40. package/contracts/message-libs/uln-302/src/send_uln.rs +51 -24
  41. package/contracts/message-libs/uln-302/src/storage.rs +2 -2
  42. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +45 -1
  43. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +63 -0
  44. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +47 -2
  45. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +50 -1
  46. package/contracts/message-libs/uln-302/src/uln302.rs +0 -8
  47. package/contracts/oapps/counter/Cargo.toml +4 -4
  48. package/contracts/oapps/counter/integration_tests/setup_uln.rs +22 -2
  49. package/contracts/oapps/counter/src/counter.rs +8 -8
  50. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +33 -10
  51. package/contracts/oapps/oapp/src/lib.rs +6 -2
  52. package/contracts/oapps/oapp/src/oapp_core.rs +49 -24
  53. package/contracts/oapps/oapp/src/oapp_options_type3.rs +21 -14
  54. package/contracts/oapps/oapp/src/oapp_receiver.rs +17 -16
  55. package/contracts/oapps/oapp/src/oapp_sender.rs +66 -15
  56. package/contracts/oapps/oapp/src/tests/oapp_core.rs +5 -5
  57. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +18 -18
  58. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +4 -4
  59. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +3 -3
  60. package/contracts/oapps/oapp-macros/Cargo.toml +0 -1
  61. package/contracts/oapps/oapp-macros/src/generators.rs +87 -46
  62. package/contracts/oapps/oapp-macros/src/lib.rs +3 -61
  63. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +9 -23
  64. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +15 -11
  65. package/contracts/oapps/oft/Cargo.toml +1 -1
  66. package/contracts/oapps/oft/integration-tests/extensions/test_oft_fee.rs +3 -3
  67. package/contracts/oapps/oft/integration-tests/extensions/test_pausable.rs +4 -4
  68. package/contracts/oapps/oft/integration-tests/extensions/test_rate_limiter.rs +144 -8
  69. package/contracts/oapps/oft/integration-tests/setup.rs +4 -2
  70. package/contracts/oapps/oft/integration-tests/utils.rs +25 -11
  71. package/contracts/oapps/oft/src/extensions/oft_fee.rs +65 -63
  72. package/contracts/oapps/oft/src/extensions/pausable.rs +2 -3
  73. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +22 -5
  74. package/contracts/oapps/oft/src/interfaces/mint_burnable.rs +18 -0
  75. package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
  76. package/contracts/oapps/oft/src/lib.rs +4 -2
  77. package/contracts/oapps/oft/src/oft.rs +35 -36
  78. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +13 -9
  79. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +14 -9
  80. package/contracts/oapps/oft/src/oft_types/mod.rs +14 -12
  81. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +28 -20
  82. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +136 -2
  83. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +12 -8
  84. package/contracts/oapps/oft-core/integration-tests/setup.rs +8 -9
  85. package/contracts/oapps/oft-core/integration-tests/test_with_sml.rs +7 -6
  86. package/contracts/oapps/oft-core/integration-tests/utils.rs +5 -4
  87. package/contracts/oapps/oft-core/src/codec/oft_compose_msg_codec.rs +2 -2
  88. package/contracts/oapps/oft-core/src/codec/oft_msg_codec.rs +33 -37
  89. package/contracts/oapps/oft-core/src/errors.rs +2 -1
  90. package/contracts/oapps/oft-core/src/events.rs +6 -0
  91. package/contracts/oapps/oft-core/src/lib.rs +8 -4
  92. package/contracts/oapps/oft-core/src/oft_core.rs +205 -148
  93. package/contracts/oapps/oft-core/src/storage.rs +4 -2
  94. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +2 -2
  95. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +6 -6
  96. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +7 -6
  97. package/contracts/oapps/oft-core/src/tests/test_oft_msg_codec.rs +11 -82
  98. package/contracts/oapps/oft-core/src/tests/test_quote_oft.rs +13 -13
  99. package/contracts/oapps/oft-core/src/tests/test_quote_send.rs +1 -1
  100. package/contracts/oapps/oft-core/src/tests/test_resolve_address.rs +2 -2
  101. package/contracts/oapps/oft-core/src/tests/test_send.rs +22 -22
  102. package/contracts/oapps/oft-core/src/tests/test_utils.rs +20 -22
  103. package/contracts/oapps/oft-core/src/utils.rs +12 -8
  104. package/contracts/sac-manager/Cargo.toml +25 -0
  105. package/contracts/sac-manager/src/errors.rs +18 -0
  106. package/contracts/sac-manager/src/extensions/mod.rs +6 -0
  107. package/contracts/sac-manager/src/extensions/redistribution.rs +109 -0
  108. package/contracts/sac-manager/src/extensions/supply_control/mod.rs +488 -0
  109. package/contracts/sac-manager/src/extensions/supply_control/rate_limit.rs +126 -0
  110. package/contracts/sac-manager/src/interfaces/mod.rs +3 -0
  111. package/contracts/sac-manager/src/interfaces/sac_manager.rs +52 -0
  112. package/contracts/sac-manager/src/lib.rs +23 -0
  113. package/contracts/sac-manager/src/sac_manager.rs +193 -0
  114. package/contracts/sac-manager/src/storage.rs +20 -0
  115. package/contracts/sac-manager/src/tests/mod.rs +14 -0
  116. package/contracts/sac-manager/src/tests/redistribution/mod.rs +1 -0
  117. package/contracts/sac-manager/src/tests/redistribution/redistribute_funds.rs +82 -0
  118. package/contracts/sac-manager/src/tests/sac_manager/admin_mint.rs +206 -0
  119. package/contracts/sac-manager/src/tests/sac_manager/burn.rs +215 -0
  120. package/contracts/sac-manager/src/tests/sac_manager/clawback.rs +209 -0
  121. package/contracts/sac-manager/src/tests/sac_manager/mint.rs +252 -0
  122. package/contracts/sac-manager/src/tests/sac_manager/mod.rs +9 -0
  123. package/contracts/sac-manager/src/tests/sac_manager/set_admin.rs +36 -0
  124. package/contracts/sac-manager/src/tests/sac_manager/set_authorized.rs +43 -0
  125. package/contracts/sac-manager/src/tests/sac_manager/set_oft_address.rs +47 -0
  126. package/contracts/sac-manager/src/tests/sac_manager/test_helper.rs +75 -0
  127. package/contracts/sac-manager/src/tests/sac_manager/view_functions.rs +60 -0
  128. package/contracts/sac-manager/src/tests/supply_control/enumerable_set.rs +256 -0
  129. package/contracts/sac-manager/src/tests/supply_control/mod.rs +8 -0
  130. package/contracts/sac-manager/src/tests/supply_control/refill.rs +90 -0
  131. package/contracts/sac-manager/src/tests/supply_control/set_mint_whitelist.rs +245 -0
  132. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller.rs +267 -0
  133. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller_manager.rs +122 -0
  134. package/contracts/sac-manager/src/tests/supply_control/test_helper.rs +38 -0
  135. package/contracts/sac-manager/src/tests/supply_control/update_allow_any_mint_burn.rs +114 -0
  136. package/contracts/sac-manager/src/tests/supply_control/update_limit_config.rs +257 -0
  137. package/contracts/sac-manager/src/tests/test_helper.rs +190 -0
  138. package/contracts/upgrader/src/lib.rs +2 -1
  139. package/contracts/utils/src/errors.rs +0 -1
  140. package/contracts/utils/src/tests/upgradeable.rs +0 -66
  141. package/contracts/utils/src/upgradeable.rs +0 -18
  142. package/contracts/workers/dvn/src/dvn.rs +2 -2
  143. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  144. package/contracts/workers/dvn/src/lib.rs +2 -1
  145. package/contracts/workers/dvn-fee-lib/src/lib.rs +3 -1
  146. package/contracts/workers/executor/src/auth.rs +42 -26
  147. package/contracts/workers/executor/src/executor.rs +28 -3
  148. package/contracts/workers/executor/src/lib.rs +4 -2
  149. package/contracts/workers/executor/src/storage.rs +21 -1
  150. package/contracts/workers/executor/src/tests/auth.rs +64 -20
  151. package/contracts/workers/executor/src/tests/executor.rs +1 -1
  152. package/contracts/workers/executor/src/tests/setup.rs +18 -0
  153. package/contracts/workers/executor-fee-lib/src/lib.rs +4 -1
  154. package/contracts/workers/executor-helper/src/executor_helper.rs +24 -10
  155. package/contracts/workers/executor-helper/src/tests/setup.rs +147 -34
  156. package/contracts/workers/price-feed/src/lib.rs +3 -1
  157. package/contracts/workers/worker/src/lib.rs +2 -1
  158. package/contracts/workers/worker/src/worker.rs +31 -17
  159. package/docs/oapp-guide.md +17 -8
  160. package/docs/oft-guide.md +3 -3
  161. package/package.json +3 -3
  162. package/sdk/.turbo/turbo-test.log +512 -351
  163. package/sdk/dist/generated/bml.d.ts +3 -9
  164. package/sdk/dist/generated/bml.js +6 -7
  165. package/sdk/dist/generated/counter.d.ts +22 -28
  166. package/sdk/dist/generated/counter.js +11 -12
  167. package/sdk/dist/generated/dvn.d.ts +36 -54
  168. package/sdk/dist/generated/dvn.js +10 -15
  169. package/sdk/dist/generated/dvn_fee_lib.d.ts +3 -21
  170. package/sdk/dist/generated/dvn_fee_lib.js +6 -11
  171. package/sdk/dist/generated/endpoint.d.ts +3 -9
  172. package/sdk/dist/generated/endpoint.js +6 -7
  173. package/sdk/dist/generated/executor.d.ts +80 -54
  174. package/sdk/dist/generated/executor.js +16 -16
  175. package/sdk/dist/generated/executor_fee_lib.d.ts +3 -21
  176. package/sdk/dist/generated/executor_fee_lib.js +6 -11
  177. package/sdk/dist/generated/executor_helper.d.ts +36 -42
  178. package/sdk/dist/generated/executor_helper.js +9 -10
  179. package/sdk/dist/generated/layerzero_view.d.ts +20 -32
  180. package/sdk/dist/generated/layerzero_view.js +25 -26
  181. package/sdk/dist/generated/oft.d.ts +147 -79
  182. package/sdk/dist/generated/oft.js +47 -54
  183. package/sdk/dist/generated/price_feed.d.ts +20 -38
  184. package/sdk/dist/generated/price_feed.js +15 -20
  185. package/sdk/dist/generated/sac_manager.d.ts +1309 -0
  186. package/sdk/dist/generated/sac_manager.js +484 -0
  187. package/sdk/dist/generated/sml.d.ts +3 -9
  188. package/sdk/dist/generated/sml.js +6 -7
  189. package/sdk/dist/generated/treasury.d.ts +3 -9
  190. package/sdk/dist/generated/treasury.js +8 -9
  191. package/sdk/dist/generated/uln302.d.ts +20 -20
  192. package/sdk/dist/generated/uln302.js +25 -22
  193. package/sdk/dist/generated/upgrader.d.ts +3 -9
  194. package/sdk/dist/generated/upgrader.js +6 -7
  195. package/sdk/dist/index.d.ts +1 -0
  196. package/sdk/dist/index.js +1 -0
  197. package/sdk/package.json +1 -1
  198. package/sdk/src/index.ts +1 -0
  199. package/sdk/test/oft-sml.test.ts +7 -5
  200. package/sdk/test/sac-manager-redistribution.test.ts +578 -0
  201. package/sdk/test/suites/globalSetup.ts +11 -6
  202. package/sdk/test/test_data/test_upgradeable_dvn.wasm +0 -0
  203. package/sdk/test/upgrader.test.ts +75 -202
  204. package/sdk/test/utils.ts +40 -0
  205. package/tools/ts-bindings-gen/src/main.rs +1 -0
@@ -1,5 +1,4 @@
1
- import { Address, authorizeEntry, Keypair, xdr } from '@stellar/stellar-sdk';
2
- import { assembleTransaction } from '@stellar/stellar-sdk/rpc';
1
+ import { BASE_FEE, Contract, scValToNative, TransactionBuilder, xdr } from '@stellar/stellar-sdk';
3
2
  import * as rpc from '@stellar/stellar-sdk/rpc';
4
3
  import { readFileSync } from 'fs';
5
4
  import path from 'path';
@@ -7,13 +6,20 @@ import { describe, expect, it } from 'vitest';
7
6
 
8
7
  import { getFullyQualifiedRepoRootPath } from '@layerzerolabs/common-node-utils';
9
8
 
9
+ import { Client as DvnClient } from '../src/generated/dvn';
10
10
  import { Client as UpgraderClient } from '../src/generated/upgrader';
11
- import { DEFAULT_DEPLOYER, NETWORK_PASSPHRASE, RPC_URL } from './suites/constants';
11
+ import {
12
+ DEFAULT_DEPLOYER,
13
+ DVN_SIGNER,
14
+ DVN_VID,
15
+ NETWORK_PASSPHRASE,
16
+ RPC_URL,
17
+ } from './suites/constants';
12
18
  import { deployContract, uploadWasm } from './suites/deploy';
13
- import { Client as DummyContractClient } from './suites/dummyContractClient';
19
+ import { signDvnAuthEntries } from './utils';
14
20
 
15
21
  let upgraderClient: UpgraderClient;
16
- let dummyContractClient: DummyContractClient;
22
+ let dvnClient: DvnClient;
17
23
  let testContractAddress: string;
18
24
 
19
25
  // Test data paths
@@ -36,16 +42,14 @@ describe('Upgrader Contract Testing', async () => {
36
42
  'contracts',
37
43
  'protocol',
38
44
  'stellar',
39
- 'contracts',
40
- 'upgrader',
41
- 'src',
42
- 'tests',
45
+ 'sdk',
46
+ 'test',
43
47
  'test_data',
44
48
  );
45
49
 
46
50
  const UPGRADER_WASM_PATH = path.join(upgraderWasmDir, 'upgrader.wasm');
47
- TEST_CONTRACT_V1_WASM_PATH = path.join(testDataDir, 'test_upgradeable_contract1.wasm');
48
- TEST_CONTRACT_V2_WASM_PATH = path.join(testDataDir, 'test_upgradeable_contract2.wasm');
51
+ TEST_CONTRACT_V1_WASM_PATH = path.join(upgraderWasmDir, 'dvn.wasm');
52
+ TEST_CONTRACT_V2_WASM_PATH = path.join(testDataDir, 'test_upgradeable_dvn.wasm');
49
53
 
50
54
  describe('Contract Deployments', () => {
51
55
  it('Deploy Upgrader Contract', async () => {
@@ -61,99 +65,34 @@ describe('Upgrader Contract Testing', async () => {
61
65
  expect(upgraderClient.options.contractId).toBeDefined();
62
66
  });
63
67
 
64
- it('Deploy Test Upgradeable Contract V1', async () => {
68
+ it('Deploy DVN Contract V1', async () => {
65
69
  console.log('📖 Reading Test Contract V1 WASM file from:', TEST_CONTRACT_V1_WASM_PATH);
66
-
67
- const server = new rpc.Server(RPC_URL, { allowHttp: true });
68
-
69
- // Read and upload WASM
70
- const wasmBuffer = readFileSync(TEST_CONTRACT_V1_WASM_PATH);
71
- const wasmHash = await uploadWasm(wasmBuffer, DEFAULT_DEPLOYER, server);
72
- console.log('✅ Test Contract V1 WASM uploaded, hash:', wasmHash);
73
-
74
- // Deploy test contract V1 with owner as constructor arg
75
- console.log('🚀 Deploying Test Contract V1...');
76
- const { TransactionBuilder, Operation, StrKey, Address } = await import(
77
- '@stellar/stellar-sdk'
78
- );
79
-
80
- const account = await server.getAccount(DEFAULT_DEPLOYER.publicKey());
81
- const salt = Buffer.from(Keypair.random().rawPublicKey());
82
-
83
- // Create contract from WASM with constructor args
84
- const wasmHashBuffer = Buffer.from(wasmHash, 'hex');
85
-
86
- // Encode constructor args: owner (Address)
87
- const ownerScVal = Address.fromString(DEFAULT_DEPLOYER.publicKey()).toScVal();
88
-
89
- const createContractTx = new TransactionBuilder(account, {
90
- fee: '100000',
91
- networkPassphrase: NETWORK_PASSPHRASE,
92
- })
93
- .addOperation(
94
- Operation.createCustomContract({
95
- address: Address.fromString(DEFAULT_DEPLOYER.publicKey()),
96
- wasmHash: wasmHashBuffer,
97
- salt: salt,
98
- constructorArgs: [ownerScVal],
99
- }),
100
- )
101
- .setTimeout(30)
102
- .build();
103
-
104
- // Simulate to get the contract ID
105
- const simulated = await server.simulateTransaction(createContractTx);
106
- const preparedTx = rpc.assembleTransaction(createContractTx, simulated).build();
107
- preparedTx.sign(DEFAULT_DEPLOYER);
108
-
109
- const sendResult = await server.sendTransaction(preparedTx);
110
- if (sendResult.status !== 'PENDING') {
111
- throw new Error(`Transaction failed: ${JSON.stringify(sendResult)}`);
112
- }
113
-
114
- const txResult = await server.pollTransaction(sendResult.hash);
115
- if (txResult.status !== 'SUCCESS') {
116
- throw new Error(`Transaction not successful: ${JSON.stringify(txResult)}`);
117
- }
118
-
119
- // Extract contract address from the transaction result
120
- const returnValue = txResult.returnValue;
121
- if (!returnValue) {
122
- throw new Error('No return value from contract creation');
123
- }
124
-
125
- // The return value is an Address ScVal, decode it
126
- const contractIdHash = returnValue.address().contractId();
127
- testContractAddress = StrKey.encodeContract(
128
- Buffer.from(contractIdHash as unknown as Uint8Array),
129
- );
130
-
131
- // Create client for the deployed contract
132
- dummyContractClient = new DummyContractClient({
133
- contractId: testContractAddress,
134
- publicKey: DEFAULT_DEPLOYER.publicKey(),
135
- signTransaction: async (tx: string) => {
136
- const transaction = TransactionBuilder.fromXDR(tx, NETWORK_PASSPHRASE);
137
- transaction.sign(DEFAULT_DEPLOYER);
138
- return {
139
- signedTxXdr: transaction.toXDR(),
140
- signerAddress: DEFAULT_DEPLOYER.publicKey(),
141
- };
70
+ dvnClient = await deployContract<DvnClient>(
71
+ DvnClient,
72
+ TEST_CONTRACT_V1_WASM_PATH,
73
+ {
74
+ vid: DVN_VID,
75
+ signers: [DVN_SIGNER.ethAddress],
76
+ threshold: 1,
77
+ admins: [DEFAULT_DEPLOYER.publicKey()],
78
+ supported_msglibs: [],
79
+ price_feed: DEFAULT_DEPLOYER.publicKey(),
80
+ default_multiplier_bps: 10000,
81
+ worker_fee_lib: DEFAULT_DEPLOYER.publicKey(),
82
+ deposit_address: DEFAULT_DEPLOYER.publicKey(),
142
83
  },
143
- rpcUrl: RPC_URL,
144
- networkPassphrase: NETWORK_PASSPHRASE,
145
- allowHttp: true,
146
- });
84
+ DEFAULT_DEPLOYER,
85
+ );
86
+ testContractAddress = dvnClient.options.contractId;
147
87
 
148
88
  console.log('✅ Test Contract V1 deployed at:', testContractAddress);
149
89
  expect(testContractAddress).toBeDefined();
150
90
  });
151
91
 
152
- it('Verify Test Contract V1 Counter', async () => {
153
- // Call counter() on V1 contract, should return 1
154
- const { result } = await dummyContractClient.counter();
155
- console.log('✅ Test Contract V1 counter value:', result);
156
- expect(result).toBe(1);
92
+ it('Verify Test Contract V1 VID', async () => {
93
+ const { result } = await dvnClient.vid();
94
+ console.log('✅ Test Contract V1 vid value:', result);
95
+ expect(result).toBe(DVN_VID);
157
96
  });
158
97
  });
159
98
 
@@ -172,128 +111,62 @@ describe('Upgrader Contract Testing', async () => {
172
111
  expect(newWasmHash).toBeDefined();
173
112
  });
174
113
 
175
- it('Test Upgrader Contract Can Be Called', async () => {
114
+ it('Test Upgrader Contract Can Upgrade DVN with Multisig Auth', async () => {
176
115
  console.log('🔄 Testing upgrader contract call...');
177
116
  console.log(' Contract address:', testContractAddress);
178
117
  console.log(' New WASM hash:', newWasmHash);
179
118
 
180
- // NOTE: Using Option 2 - Hybrid approach with generated client
181
- // Build with generated client, then manually simulate with authMode, then inject back
182
- const counterValue = 2;
183
- const server = new rpc.Server(RPC_URL, { allowHttp: true });
184
-
185
- // 1. Build transaction using generated client (don't auto-simulate)
186
- const assembledTx = await upgraderClient.upgrade_and_migrate(
187
- {
188
- contract_address: testContractAddress,
189
- wasm_hash: Buffer.from(newWasmHash, 'hex'),
190
- migration_data: xdr.ScVal.scvU32(counterValue).toXDR(),
191
- },
192
- {
193
- simulate: false, // Don't simulate yet
194
- },
195
- );
196
-
197
- console.log('✅ Transaction built with generated client');
198
-
199
- // Build the transaction from the raw builder
200
- const rawTx = assembledTx.raw!.build();
201
-
202
- console.log('✅ Raw transaction built');
119
+ const upgradeTx = await upgraderClient.upgrade_and_migrate({
120
+ contract_address: testContractAddress,
121
+ wasm_hash: Buffer.from(newWasmHash, 'hex'),
122
+ migration_data: xdr.ScVal.scvVoid().toXDR(),
123
+ });
203
124
 
204
- // 2. Manually simulate with record_allow_nonroot authMode
205
- const sim = await server.simulateTransaction(
206
- rawTx,
207
- undefined, // addlResources
208
- 'record_allow_nonroot', // ← This enables non-root auth recording!
125
+ await signDvnAuthEntries(
126
+ testContractAddress,
127
+ DVN_VID,
128
+ DEFAULT_DEPLOYER,
129
+ [DVN_SIGNER],
130
+ upgradeTx,
131
+ NETWORK_PASSPHRASE,
209
132
  );
210
133
 
211
- if (rpc.Api.isSimulationError(sim)) {
212
- throw new Error(`Simulation failed: ${JSON.stringify(sim)}`);
213
- }
214
-
215
- console.log('✅ Transaction simulated with record_allow_nonroot');
216
- console.log(' Auth entries returned:', sim.result?.auth?.length ?? 0);
217
-
218
- // 3. Sign auth entries manually (high-level API doesn't see them after injection)
219
- const latestLedger = sim.latestLedger;
220
- const validUntilLedger = latestLedger + 100;
221
-
222
- if (sim.result && sim.result.auth) {
223
- sim.result.auth = await Promise.all(
224
- sim.result.auth.map(async (entry) => {
225
- // Source account credentials are already signed by tx envelope
226
- if (
227
- entry.credentials().switch() ===
228
- xdr.SorobanCredentialsType.sorobanCredentialsSourceAccount()
229
- ) {
230
- console.log(' Skipping source account auth entry');
231
- return entry;
232
- }
233
-
234
- // Address credentials need explicit signature
235
- const addr = Address.fromScAddress(
236
- entry.credentials().address().address(),
237
- ).toString();
238
-
239
- console.log(' Signing auth entry for address:', addr);
134
+ await upgradeTx.signAndSend();
135
+ console.log('✅ Upgrade transaction completed');
136
+ });
240
137
 
241
- if (addr === DEFAULT_DEPLOYER.publicKey()) {
242
- // Sign with owner's keypair
243
- return authorizeEntry(
244
- entry,
245
- DEFAULT_DEPLOYER,
246
- validUntilLedger,
247
- NETWORK_PASSPHRASE,
248
- );
249
- }
138
+ it('Verify Test Contract V2 test_upgrade_version After Upgrade', async () => {
139
+ const server = new rpc.Server(RPC_URL, { allowHttp: true });
140
+ const account = await server.getAccount(DEFAULT_DEPLOYER.publicKey());
141
+ const contract = new Contract(testContractAddress);
142
+ const tx = new TransactionBuilder(account, {
143
+ fee: BASE_FEE,
144
+ networkPassphrase: NETWORK_PASSPHRASE,
145
+ })
146
+ .addOperation(contract.call('test_upgrade_version'))
147
+ .setTimeout(30)
148
+ .build();
250
149
 
251
- throw new Error(`Unexpected auth signer needed: ${addr}`);
252
- }),
150
+ const simulated = await server.simulateTransaction(tx);
151
+ if (rpc.Api.isSimulationError(simulated)) {
152
+ throw new Error(
153
+ `test_upgrade_version simulation failed: ${JSON.stringify(simulated)}`,
253
154
  );
254
- console.log('✅ Auth entries signed');
255
155
  }
256
156
 
257
- // 4. Assemble final transaction with signed auth entries
258
- const finalTxBuilder = assembleTransaction(rawTx, sim);
259
- const finalTx = finalTxBuilder.build();
260
-
261
- console.log('✅ Final transaction assembled');
262
-
263
- // 5. Sign the transaction envelope
264
- finalTx.sign(DEFAULT_DEPLOYER);
265
-
266
- console.log('✅ Transaction envelope signed');
267
-
268
- // 6. Send and poll
269
- const sentResult = await server.sendTransaction(finalTx);
270
-
271
- if (sentResult.status !== 'PENDING') {
272
- throw new Error(`Transaction failed to send: ${JSON.stringify(sentResult)}`);
157
+ if (!simulated.result?.retval) {
158
+ throw new Error('No return value from test_upgrade_version');
273
159
  }
274
160
 
275
- console.log('✅ Transaction sent, hash:', sentResult.hash);
276
-
277
- const txResult = await server.pollTransaction(sentResult.hash);
278
-
279
- console.log('✅ Upgrade transaction completed');
280
- console.log(' Transaction status:', txResult.status);
281
-
282
- expect(txResult.status).toBe('SUCCESS');
283
- });
284
-
285
- it('Verify Test Contract V2 Counter2 After Upgrade', async () => {
286
- // After upgrade, the contract should have counter2() function that returns 2
287
- const { result } = await dummyContractClient.counter2();
288
- console.log('✅ Test Contract V2 counter2 value:', result);
161
+ const result = scValToNative(simulated.result.retval) as number;
162
+ console.log('✅ Test Contract V2 test_upgrade_version value:', result);
289
163
  expect(result).toBe(2);
290
164
  });
291
165
 
292
- it('Verify Test Contract V1 Counter Still Works After Upgrade', async () => {
293
- // The original counter() should still be accessible and return 1
294
- const { result } = await dummyContractClient.counter();
295
- console.log('✅ Test Contract V2 counter value (from V1):', result);
296
- expect(result).toBe(1);
166
+ it('Verify Test Contract V1 Methods Still Work After Upgrade', async () => {
167
+ const { result } = await dvnClient.vid();
168
+ console.log('✅ Test Contract V2 vid value (from V1):', result);
169
+ expect(result).toBe(DVN_VID);
297
170
  });
298
171
  });
299
172
  });
package/sdk/test/utils.ts CHANGED
@@ -113,6 +113,46 @@ export async function getNativeBalance(accountAddress: string): Promise<bigint>
113
113
  return getTokenBalance(accountAddress, NATIVE_TOKEN_ADDRESS);
114
114
  }
115
115
 
116
+ /**
117
+ * Helper to check if an account is authorized on a SAC (Stellar Asset Contract).
118
+ * Calls the SAC's `authorized()` method directly.
119
+ *
120
+ * @param accountAddress - The account to check authorization for
121
+ * @param tokenAddress - The SAC contract address
122
+ */
123
+ export async function getTokenAuthorized(
124
+ accountAddress: string,
125
+ tokenAddress: string,
126
+ ): Promise<boolean> {
127
+ const server = new rpc.Server(RPC_URL, { allowHttp: true });
128
+ const tokenContract = new Contract(tokenAddress);
129
+
130
+ const authorizedOp = tokenContract.call(
131
+ 'authorized',
132
+ nativeToScVal(Address.fromString(accountAddress), { type: 'address' }),
133
+ );
134
+
135
+ const account = await server.getAccount(DEFAULT_DEPLOYER.publicKey());
136
+ const tx = new TransactionBuilder(account, {
137
+ fee: BASE_FEE,
138
+ networkPassphrase: NETWORK_PASSPHRASE,
139
+ })
140
+ .addOperation(authorizedOp)
141
+ .setTimeout(30)
142
+ .build();
143
+
144
+ const simulated = await server.simulateTransaction(tx);
145
+ if (rpc.Api.isSimulationError(simulated)) {
146
+ throw new Error(`Authorized query failed: ${JSON.stringify(simulated)}`);
147
+ }
148
+
149
+ const result = (simulated as rpc.Api.SimulateTransactionSuccessResponse).result;
150
+ if (result?.retval) {
151
+ return scValToNative(result.retval) as boolean;
152
+ }
153
+ return false;
154
+ }
155
+
116
156
  // ============================================================================
117
157
  // Secp256k1 Key Pair for DVN Multisig
118
158
  // ============================================================================
@@ -103,6 +103,7 @@ fn main() -> Result<()> {
103
103
  // OApp contracts
104
104
  ("counter", "counter.ts"),
105
105
  ("oft", "oft.ts"),
106
+ ("sac_manager", "sac_manager.ts"),
106
107
  // View contracts
107
108
  ("layerzero_views", "layerzero_view.ts"),
108
109
  // Add more contracts here as needed: