Skip to content

Commit 6ba3d38

Browse files
Add get_extensions method for wallet v5
1 parent 0056fad commit 6ba3d38

File tree

5 files changed

+84
-0
lines changed

5 files changed

+84
-0
lines changed

abi/generated_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ func mustToMsgAddress(x string) tlb.MsgAddress {
9393
}
9494

9595
func TestGetMethods(t *testing.T) {
96+
extensionAddrBytes, err := hex.DecodeString("3a8f7e96e21bd7018207282a9071ef467d88250589ca6e25f7c8f45093282a4c")
97+
if err != nil {
98+
t.Fatal(err)
99+
}
100+
var extensionAddr tlb.Bits256
101+
copy(extensionAddr[:], extensionAddrBytes[:])
102+
96103
tests := []struct {
97104
name string
98105
code string
@@ -103,6 +110,30 @@ func TestGetMethods(t *testing.T) {
103110
wantTypeHint string
104111
wantError string
105112
}{
113+
{
114+
name: "w5 get extensions",
115+
code: "b5ee9c7201021401000281000114ff00f4a413f4bcf2c80b01020120020302014804050102f20e02dcd020d749c120915b8f6320d70b1f2082106578746ebd21821073696e74bdb0925f03e082106578746eba8eb48020d72101d074d721fa4030fa44f828fa443058bd915be0ed44d0810141d721f4058307f40e6fa1319130e18040d721707fdb3ce03120d749810280b99130e070e2100f020120060702012008090019be5f0f6a2684080a0eb90fa02c02016e0a0b0201480c0d0019adce76a2684020eb90eb85ffc00019af1df6a2684010eb90eb858fc00017b325fb51341c75c875c2c7e00011b262fb513435c28020011e20d70b1f82107369676ebaf2e08a7f0f01e68ef0eda2edfb218308d722028308d723208020d721d31fd31fd31fed44d0d200d31f20d31fd3ffd70a000af90140ccf9109a28945f0adb31e1f2c087df02b35007b0f2d0845125baf2e0855036baf2e086f823bbf2d0882292f800de01a47fc8ca00cb1f01cf16c9ed542092f80fde70db3cd81003f6eda2edfb02f404216e926c218e4c0221d73930709421c700b38e2d01d72820761e436c20d749c008f2e09320d74ac002f2e09320d71d06c712c2005230b0f2d089d74cd7393001a4e86c128407bbf2e093d74ac000f2e093ed55e2d20001c000915be0ebd72c08142091709601d72c081c12e25210b1e30f20d74a111213009601fa4001fa44f828fa443058baf2e091ed44d0810141d718f405049d7fc8ca0040048307f453f2e08b8e14038307f45bf2e08c22d70a00216e01b3b0f2d090e2c85003cf1612f400c9ed54007230d72c08248e2d21f2e092d200ed44d0d2005113baf2d08f54503091319c01810140d721d70a00f2e08ee2c8ca0058cf16c9ed5493f2c08de20010935bdb31e1d74cd0",
116+
data: "b5ee9c72010102010050000151800000023fffff88e6271e4a88346b532b7f68c5459fec9b5c4f8fd38de07804492ddd4a1e074468e0010043a00751efd2dc437ae03040e505520e3de8cfb104a0b1394dc4bef91e8a1265054998",
117+
account: "0:4d533395b7c8951c43e89f00a38edd9865afc569c08e07713550f29224463eee",
118+
method: GetExtensions,
119+
wantTypeHint: "GetExtensionsResult",
120+
want: GetExtensionsResult{
121+
Extensions: &WalletV5ExtensionsList{
122+
Extensions: tlb.NewHashmap([]tlb.Bits256{extensionAddr}, []tlb.Uint1{1}),
123+
},
124+
},
125+
},
126+
{
127+
name: "no w5 get extensions",
128+
code: "b5ee9c7201021401000281000114ff00f4a413f4bcf2c80b01020120020302014804050102f20e02dcd020d749c120915b8f6320d70b1f2082106578746ebd21821073696e74bdb0925f03e082106578746eba8eb48020d72101d074d721fa4030fa44f828fa443058bd915be0ed44d0810141d721f4058307f40e6fa1319130e18040d721707fdb3ce03120d749810280b99130e070e2100f020120060702012008090019be5f0f6a2684080a0eb90fa02c02016e0a0b0201480c0d0019adce76a2684020eb90eb85ffc00019af1df6a2684010eb90eb858fc00017b325fb51341c75c875c2c7e00011b262fb513435c28020011e20d70b1f82107369676ebaf2e08a7f0f01e68ef0eda2edfb218308d722028308d723208020d721d31fd31fd31fed44d0d200d31f20d31fd3ffd70a000af90140ccf9109a28945f0adb31e1f2c087df02b35007b0f2d0845125baf2e0855036baf2e086f823bbf2d0882292f800de01a47fc8ca00cb1f01cf16c9ed542092f80fde70db3cd81003f6eda2edfb02f404216e926c218e4c0221d73930709421c700b38e2d01d72820761e436c20d749c008f2e09320d74ac002f2e09320d71d06c712c2005230b0f2d089d74cd7393001a4e86c128407bbf2e093d74ac000f2e093ed55e2d20001c000915be0ebd72c08142091709601d72c081c12e25210b1e30f20d74a111213009601fa4001fa44f828fa443058baf2e091ed44d0810141d718f405049d7fc8ca0040048307f453f2e08b8e14038307f45bf2e08c22d70a00216e01b3b0f2d090e2c85003cf1612f400c9ed54007230d72c08248e2d21f2e092d200ed44d0d2005113baf2d08f54503091319c01810140d721d70a00f2e08ee2c8ca0058cf16c9ed5493f2c08de20010935bdb31e1d74cd0",
129+
data: "b5ee9c7201010101002b00005180000000bfffff88c2b3994c1474396d2f8e66cf7ad8e95400330682aeadcfbd4c83259761809769a0",
130+
account: "0:43bc2ec288ea2d36120c6e9c151f3ee55c0e332fb2a4d14c572162463c5cd1cd",
131+
method: GetExtensions,
132+
wantTypeHint: "GetExtensionsResult",
133+
want: GetExtensionsResult{
134+
Extensions: nil,
135+
},
136+
},
106137
{
107138
name: "Subscription v2 GetPaymentInfo",
108139
code: "b5ee9c7201021c0100065b000114ff00f4a413f4bcf2c80b010201200203020148040502a8f2d31f840f02821043d0ed9aba12f2f4ed44d0f40431d31f20d31fd300d4d31f03f2e1d0f82324bef8235152a015b914b0f2e1cdf8230373a90415a012bef2e1cef800812ee070f83603d0fa005114bae3025f0317180202cb060702015813140201200809005dd087e910c2049c4007e0d9c2084191cdd1cb220040072c1540173c5963e809c0072da84f2c7c4b2cff25cfec03c03a02cbd99f6a2687a0200fc36e98f80fc35698f80fc34698000fc30ea00fc37698f80fc34fd0000fc35fd2000fc31698380fc31fd2000fc32699f80fc32fd0000fc33698f80fc33ea187c36686981fd201800b8d8492f81f001698fe99f9890c10878363ab3dd718140a0b0201f4111201d65bf84212c705f2e1cff846bef2e1ccf848f841f8495220a0f823b9b193f847a09630f823f847a0e2f84d6eb3f84bc300b08e18f84dd0c8801001cb0501cf16f84bfa027001cb6ac970fb00deed44d0f404318041d72171f84a6dc8f400cb1f13cb1f12cb0001cf16c9ed540c03d6ed44d0f40401f86dd31f01f86ad31f01f868d30001f861d401f86ed31f01f869fa0001f86bfa4001f862d30701f863fa4001f864d33f01f865fa0001f866d31f01f867d430f86c21821064737472bae302218210508238ecbae302018210f71783cbbae3025f03840ff2f00d0e0f0076814aea70f836a703802d814e208209e1338070f837a070fb02f8458210f852254ec8801001cb05f844cf1670fa027001cb6acb1fcb3fc98306fb0000f25f03f8445210c705f843c033b09730f842f844f00f8e24f8445210c705f843c004b09730f842f844f0109ff842c70594f844f00e94840ff2f0e2e2e270f861f84cf847f845f843f849f84ef841f848f84af84dc8f400cb1fcb1fcb00cccb1ff84bfa02f842cf16cb07f844cf16cb3ff846fa02cb1fccc9ed5400a26c21f84412c705f2e1d3fa0030f8465210b9f2e1d5f866f84cf847f845f843f849f84ef841f848f84af84dc8f400cb1fcb1fcb00cccb1ff84bfa02f842cf16cb07f844cf16cb3ff846fa02cb1fccc9ed540390f841c000f2e1d0f84213c705f2e1cf01d31f21c00022f823beb1f2e1d471f861fa0001f866d31f01f867d31f01f869fa0001f86bd430f86c209331f868e30e812ee070f836db3c3010191a009230f846bef2e1cc814aea70f836a703802d814e208209e1338070f837a070fb02f8458210f852254ec8801001cb05f844cf1670fa027001cb6acb1fcb3fc98306fb00f823f847a0f868002b3220040072c14073c59c3e809c0072dab260c1bec0200089087e910c2049c4007e0d9c5c082084195e1d1bb220040072c15401f3c594013e809c0072da8572c7c4b2cfc4f2c004b2c03e0a1b5cd400f2c1c073c5bd00325cfec03c03a0020120151600a7bb90ced44d0f40401f86dd31f01f86ad31f01f868d30001f861d401f86ed31f01f869fa0001f86bfa4001f862d30701f863fa4001f864d33f01f865fa0001f866d31f01f867d430f86cf842f843f844f845f84c80031b7a270295d4e1f06d4e07005b029c410413c26700e1f06f41000afb5e87da89a1e80803f0dba63e03f0d5a63e03f0d1a60003f0c3a803f0dda63e03f0d3f40003f0d7f48003f0c5a60e03f0c7f48003f0c9a67e03f0cbf40003f0cda63e03f0cfa861f0d9f083f08df08ff091f093f095f097000563302d430ed5501fa0030c8019cc803fa403013cf16c958f40095326d58f400e2f82301cb1f01cf16c9ed5402beed44d0f40401f86dd31f01f86ad31f01f868d30001f861d401f86ed31f01f869fa0001f86bfa4001f862d30701f863fa4001f864d33f01f865fa0001f866d31f01f867d430f86cdb3ced55f823f86af84b9ac801fa4030cf16c9f86d9130e2191a01ba6df843c0338e36f843c0048e2a30f846216d708210706c7567c8801801cb05f842cf165004fa027001cb6a13cb1f12cb3f58fa02f400c994840ff2f0e2e30dc8c9702282100ec3c86d03c8cc13cb1fcb07ccc9c85003fa0212ccc9f86e1b0074f84cf847f845f843f849f84ef841f848f84af84dc8f400cb1fcb1fcb00cccb1ff84bfa02f842cf16cb07f844cf16cb3ff846fa02cb1fccc9ed5400be30f84621f8258210f06c7567c8801801cb05f828cf165004fa027001cb6a13cb1f12cb3fc970821032bc3a37aa40c8801801cb05f842cf165004fa027001cb6a13cb5fc8c98042580382100ec3c86d03c8cc13cb1fcb07ccc901f400cb00c9",

abi/get_methods.go

+36
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ var KnownGetMethodsDecoder = map[string][]func(tlb.VmStack) (string, any, error)
3434
"get_executor_collection_address": {DecodeGetExecutorCollectionAddress_StormResult},
3535
"get_executor_vaults_whitelist": {DecodeGetExecutorVaultsWhitelist_StormResult},
3636
"get_expected_outputs": {DecodeGetExpectedOutputs_StonfiResult},
37+
"get_extensions": {DecodeGetExtensionsResult},
3738
"get_fix_price_data_v4": {DecodeGetFixPriceDataV4Result},
3839
"get_full_domain": {DecodeGetFullDomainResult},
3940
"get_jetton_data": {DecodeGetJettonDataResult},
@@ -187,6 +188,7 @@ var KnownSimpleGetMethods = map[int][]func(ctx context.Context, executor Executo
187188
111161: {ListNominators},
188189
115150: {GetParams},
189190
116242: {GetLpSwapData},
191+
117729: {GetExtensions},
190192
118188: {GetAssets},
191193
118274: {GetLockerBillData},
192194
119378: {GetDomain},
@@ -236,6 +238,7 @@ var resultTypes = []interface{}{
236238
&GetExecutorCollectionAddress_StormResult{},
237239
&GetExecutorVaultsWhitelist_StormResult{},
238240
&GetExpectedOutputs_StonfiResult{},
241+
&GetExtensionsResult{},
239242
&GetFixPriceDataV4Result{},
240243
&GetFullDomainResult{},
241244
&GetJettonDataResult{},
@@ -1225,6 +1228,39 @@ func DecodeGetExpectedOutputs_StonfiResult(stack tlb.VmStack) (resultType string
12251228
return "GetExpectedOutputs_StonfiResult", result, err
12261229
}
12271230

1231+
type GetExtensionsResult struct {
1232+
Extensions *WalletV5ExtensionsList
1233+
}
1234+
1235+
func GetExtensions(ctx context.Context, executor Executor, reqAccountID ton.AccountID) (string, any, error) {
1236+
stack := tlb.VmStack{}
1237+
1238+
// MethodID = 117729 for "get_extensions" method
1239+
errCode, stack, err := executor.RunSmcMethodByID(ctx, reqAccountID, 117729, stack)
1240+
if err != nil {
1241+
return "", nil, err
1242+
}
1243+
if errCode != 0 && errCode != 1 {
1244+
return "", nil, fmt.Errorf("method execution failed with code: %v", errCode)
1245+
}
1246+
for _, f := range []func(tlb.VmStack) (string, any, error){DecodeGetExtensionsResult} {
1247+
s, r, err := f(stack)
1248+
if err == nil {
1249+
return s, r, nil
1250+
}
1251+
}
1252+
return "", nil, fmt.Errorf("can not decode outputs")
1253+
}
1254+
1255+
func DecodeGetExtensionsResult(stack tlb.VmStack) (resultType string, resultAny any, err error) {
1256+
if len(stack) != 1 || (stack[0].SumType != "VmStkCell" && stack[0].SumType != "VmStkNull") {
1257+
return "", nil, fmt.Errorf("invalid stack format")
1258+
}
1259+
var result GetExtensionsResult
1260+
err = stack.Unmarshal(&result)
1261+
return "GetExtensionsResult", result, err
1262+
}
1263+
12281264
type GetFixPriceDataV4Result struct {
12291265
IsComplete bool
12301266
CreatedAt uint32

abi/interfaces.go

+5
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,10 @@ var methodInvocationOrder = []MethodDescription{
481481
Name: "get_executor_vaults_whitelist",
482482
InvokeFn: GetExecutorVaultsWhitelist,
483483
},
484+
{
485+
Name: "get_extensions",
486+
InvokeFn: GetExtensions,
487+
},
484488
{
485489
Name: "get_fix_price_data_v4",
486490
InvokeFn: GetFixPriceDataV4,
@@ -1144,6 +1148,7 @@ var knownContracts = map[ton.Bits256]knownContractDescription{
11441148
ton.MustParseHash("20834b7b72b112147e1b2fb457b84e74d1a30f04f737d4f62a668e9552d2b72f"): {
11451149
contractInterfaces: []ContractInterface{WalletV5R1},
11461150
getMethods: []InvokeFn{
1151+
GetExtensions,
11471152
GetPublicKey,
11481153
GetSubwalletId,
11491154
Seqno,

abi/schemas/wallets.xml

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
msg_inner#_ {n:#} subwallet_id:uint32 message_to_send:^MessageRelaxed send_mode:uint8 query_id:HighloadV3QueryId created_at:uint64 timeout:uint22 = HighloadV3MsgInner;
2828

2929
msg_inner#_ valid_until:uint64 seq_no:uint16 actions:^W5Actions = PreprocessedWalletV2MsgInner;
30+
31+
extensions#_ extensions:(Hashmap 256 uint1) = WalletV5ExtensionsList;
3032
</types>
3133
<!-- Wallets -->
3234
<interface name="wallet"/>
@@ -105,6 +107,7 @@
105107
<get_method name="seqno"/>
106108
<get_method name="get_public_key"/>
107109
<get_method name="get_subwallet_id"/>
110+
<get_method name="get_extensions"/>
108111
<msg_in>
109112
<ext_in name="wallet_signed_external_v5r1"/>
110113
<internal name="wallet_signed_internal_v5r1"/>
@@ -189,6 +192,11 @@
189192
<int name="timestamp">uint64</int>
190193
</output>
191194
</get_method>
195+
<get_method name="get_extensions">
196+
<output fixed_length="true">
197+
<cell name="extensions" nullable="true">WalletV5ExtensionsList</cell>
198+
</output>
199+
</get_method>
192200
<ext_in name="wallet_signed_v3">
193201
signed#_ signature:bits512 subwallet_id:uint32 valid_until:uint32 seqno:uint32 payload:WalletV1toV4Payload =
194202
ExternalMsgBody;

abi/types.go

+4
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,10 @@ type SendMessageAction struct {
516516
Message MessageRelaxed `tlb:"^"`
517517
}
518518

519+
type WalletV5ExtensionsList struct {
520+
Extensions tlb.Hashmap[tlb.Bits256, tlb.Uint1]
521+
}
522+
519523
type WhalesNominatorsMember struct {
520524
ProfitPerCoin tlb.Int128
521525
Balance tlb.Grams

0 commit comments

Comments
 (0)