@recoillink/radix-sdk 0.0.0-stage → 45.0.1
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.md +193 -0
- package/README.md +42 -2
- package/dist/clients/protocol.d.ts +31 -0
- package/dist/clients/protocol.d.ts.map +1 -0
- package/dist/clients/protocol.js +95 -0
- package/dist/clients/protocol.js.map +1 -0
- package/dist/clients/provider.d.ts +60 -0
- package/dist/clients/provider.d.ts.map +1 -0
- package/dist/clients/provider.js +187 -0
- package/dist/clients/provider.js.map +1 -0
- package/dist/clients/signer.d.ts +24 -0
- package/dist/clients/signer.d.ts.map +1 -0
- package/dist/clients/signer.js +86 -0
- package/dist/clients/signer.js.map +1 -0
- package/dist/hook/hook-artifact-manager.d.ts +17 -0
- package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/hook-artifact-manager.js +60 -0
- package/dist/hook/hook-artifact-manager.js.map +1 -0
- package/dist/hook/hook-query.d.ts +22 -0
- package/dist/hook/hook-query.d.ts.map +1 -0
- package/dist/hook/hook-query.js +79 -0
- package/dist/hook/hook-query.js.map +1 -0
- package/dist/hook/hook-tx.d.ts +21 -0
- package/dist/hook/hook-tx.d.ts.map +1 -0
- package/dist/hook/hook-tx.js +26 -0
- package/dist/hook/hook-tx.js.map +1 -0
- package/dist/hook/igp-hook.d.ts +24 -0
- package/dist/hook/igp-hook.d.ts.map +1 -0
- package/dist/hook/igp-hook.js +148 -0
- package/dist/hook/igp-hook.js.map +1 -0
- package/dist/hook/merkle-tree-hook.d.ts +24 -0
- package/dist/hook/merkle-tree-hook.d.ts.map +1 -0
- package/dist/hook/merkle-tree-hook.js +51 -0
- package/dist/hook/merkle-tree-hook.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ism/ism-artifact-manager.d.ts +14 -0
- package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/ism-artifact-manager.js +67 -0
- package/dist/ism/ism-artifact-manager.js.map +1 -0
- package/dist/ism/ism-query.d.ts +23 -0
- package/dist/ism/ism-query.d.ts.map +1 -0
- package/dist/ism/ism-query.js +84 -0
- package/dist/ism/ism-query.js.map +1 -0
- package/dist/ism/ism-tx.d.ts +31 -0
- package/dist/ism/ism-tx.d.ts.map +1 -0
- package/dist/ism/ism-tx.js +43 -0
- package/dist/ism/ism-tx.js.map +1 -0
- package/dist/ism/multisig-ism.d.ts +38 -0
- package/dist/ism/multisig-ism.d.ts.map +1 -0
- package/dist/ism/multisig-ism.js +107 -0
- package/dist/ism/multisig-ism.js.map +1 -0
- package/dist/ism/routing-ism.d.ts +23 -0
- package/dist/ism/routing-ism.d.ts.map +1 -0
- package/dist/ism/routing-ism.js +129 -0
- package/dist/ism/routing-ism.js.map +1 -0
- package/dist/ism/test-ism.d.ts +23 -0
- package/dist/ism/test-ism.d.ts.map +1 -0
- package/dist/ism/test-ism.js +49 -0
- package/dist/ism/test-ism.js.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts +15 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.js +29 -0
- package/dist/mailbox/mailbox-artifact-manager.js.map +1 -0
- package/dist/mailbox/mailbox-query.d.ts +12 -0
- package/dist/mailbox/mailbox-query.d.ts.map +1 -0
- package/dist/mailbox/mailbox-query.js +72 -0
- package/dist/mailbox/mailbox-query.js.map +1 -0
- package/dist/mailbox/mailbox-query.test.d.ts +2 -0
- package/dist/mailbox/mailbox-query.test.d.ts.map +1 -0
- package/dist/mailbox/mailbox-query.test.js +65 -0
- package/dist/mailbox/mailbox-query.test.js.map +1 -0
- package/dist/mailbox/mailbox-tx.d.ts +21 -0
- package/dist/mailbox/mailbox-tx.d.ts.map +1 -0
- package/dist/mailbox/mailbox-tx.js +27 -0
- package/dist/mailbox/mailbox-tx.js.map +1 -0
- package/dist/mailbox/mailbox.d.ts +24 -0
- package/dist/mailbox/mailbox.d.ts.map +1 -0
- package/dist/mailbox/mailbox.js +171 -0
- package/dist/mailbox/mailbox.js.map +1 -0
- package/dist/runtime.d.ts +7 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +6 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testing/constants.d.ts +61 -0
- package/dist/testing/constants.d.ts.map +1 -0
- package/dist/testing/constants.js +65 -0
- package/dist/testing/constants.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/node.d.ts +13 -0
- package/dist/testing/node.d.ts.map +1 -0
- package/dist/testing/node.js +42 -0
- package/dist/testing/node.js.map +1 -0
- package/dist/testing/setup.d.ts +20 -0
- package/dist/testing/setup.d.ts.map +1 -0
- package/dist/testing/setup.js +57 -0
- package/dist/testing/setup.js.map +1 -0
- package/dist/tests/e2e-test.setup.d.ts +3 -0
- package/dist/tests/e2e-test.setup.d.ts.map +1 -0
- package/dist/tests/e2e-test.setup.js +32 -0
- package/dist/tests/e2e-test.setup.js.map +1 -0
- package/dist/tests/hook.e2e-test.d.ts +2 -0
- package/dist/tests/hook.e2e-test.d.ts.map +1 -0
- package/dist/tests/hook.e2e-test.js +374 -0
- package/dist/tests/hook.e2e-test.js.map +1 -0
- package/dist/tests/ism.e2e-test.d.ts +2 -0
- package/dist/tests/ism.e2e-test.d.ts.map +1 -0
- package/dist/tests/ism.e2e-test.js +256 -0
- package/dist/tests/ism.e2e-test.js.map +1 -0
- package/dist/tests/mailbox.e2e-test.d.ts +2 -0
- package/dist/tests/mailbox.e2e-test.d.ts.map +1 -0
- package/dist/tests/mailbox.e2e-test.js +250 -0
- package/dist/tests/mailbox.e2e-test.js.map +1 -0
- package/dist/tests/validator-announce.e2e-test.d.ts +2 -0
- package/dist/tests/validator-announce.e2e-test.d.ts.map +1 -0
- package/dist/tests/validator-announce.e2e-test.js +107 -0
- package/dist/tests/validator-announce.e2e-test.js.map +1 -0
- package/dist/tests/warp.e2e-test.d.ts +2 -0
- package/dist/tests/warp.e2e-test.d.ts.map +1 -0
- package/dist/tests/warp.e2e-test.js +597 -0
- package/dist/tests/warp.e2e-test.js.map +1 -0
- package/dist/utils/base-query.d.ts +188 -0
- package/dist/utils/base-query.d.ts.map +1 -0
- package/dist/utils/base-query.js +209 -0
- package/dist/utils/base-query.js.map +1 -0
- package/dist/utils/base.d.ts +67 -0
- package/dist/utils/base.d.ts.map +1 -0
- package/dist/utils/base.js +355 -0
- package/dist/utils/base.js.map +1 -0
- package/dist/utils/constants.d.ts +20 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +20 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/signer.d.ts +17 -0
- package/dist/utils/signer.d.ts.map +1 -0
- package/dist/utils/signer.js +60 -0
- package/dist/utils/signer.js.map +1 -0
- package/dist/utils/types.d.ts +141 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +39 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/utils.d.ts +8 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +47 -0
- package/dist/utils/utils.js.map +1 -0
- package/dist/utils/utils.test.d.ts +2 -0
- package/dist/utils/utils.test.d.ts.map +1 -0
- package/dist/utils/utils.test.js +27 -0
- package/dist/utils/utils.test.js.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts +14 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js +21 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js.map +1 -0
- package/dist/validator-announce/validator-announce-query.d.ts +6 -0
- package/dist/validator-announce/validator-announce-query.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-query.js +10 -0
- package/dist/validator-announce/validator-announce-query.js.map +1 -0
- package/dist/validator-announce/validator-announce-tx.d.ts +4 -0
- package/dist/validator-announce/validator-announce-tx.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-tx.js +6 -0
- package/dist/validator-announce/validator-announce-tx.js.map +1 -0
- package/dist/validator-announce/validator-announce.d.ts +23 -0
- package/dist/validator-announce/validator-announce.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce.js +52 -0
- package/dist/validator-announce/validator-announce.js.map +1 -0
- package/dist/warp/collateral-token.d.ts +23 -0
- package/dist/warp/collateral-token.d.ts.map +1 -0
- package/dist/warp/collateral-token.js +130 -0
- package/dist/warp/collateral-token.js.map +1 -0
- package/dist/warp/populate.d.ts +71 -0
- package/dist/warp/populate.d.ts.map +1 -0
- package/dist/warp/populate.js +110 -0
- package/dist/warp/populate.js.map +1 -0
- package/dist/warp/query.d.ts +44 -0
- package/dist/warp/query.d.ts.map +1 -0
- package/dist/warp/query.js +163 -0
- package/dist/warp/query.js.map +1 -0
- package/dist/warp/synthetic-token.d.ts +23 -0
- package/dist/warp/synthetic-token.d.ts.map +1 -0
- package/dist/warp/synthetic-token.js +131 -0
- package/dist/warp/synthetic-token.js.map +1 -0
- package/dist/warp/warp-artifact-manager.d.ts +15 -0
- package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
- package/dist/warp/warp-artifact-manager.js +49 -0
- package/dist/warp/warp-artifact-manager.js.map +1 -0
- package/dist/warp/warp-query.d.ts +9 -0
- package/dist/warp/warp-query.d.ts.map +1 -0
- package/dist/warp/warp-query.js +130 -0
- package/dist/warp/warp-query.js.map +1 -0
- package/dist/warp/warp-tx.d.ts +48 -0
- package/dist/warp/warp-tx.d.ts.map +1 -0
- package/dist/warp/warp-tx.js +125 -0
- package/dist/warp/warp-tx.js.map +1 -0
- package/docker-compose.yml +139 -0
- package/package.json +74 -3
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AltVM } from '@recoillink/provider-sdk';
|
|
2
|
+
import { ChainMetadataForAltVM } from '@recoillink/provider-sdk/chain';
|
|
3
|
+
import { RadixBaseSigner } from '../utils/signer.js';
|
|
4
|
+
import { RadixSDKReceipt, RadixSDKTransaction } from '../utils/types.js';
|
|
5
|
+
import { RadixProvider } from './provider.js';
|
|
6
|
+
export declare class RadixSigner extends RadixProvider implements AltVM.ISigner<RadixSDKTransaction, RadixSDKReceipt> {
|
|
7
|
+
private account;
|
|
8
|
+
private signer;
|
|
9
|
+
private constructor();
|
|
10
|
+
static connectWithSigner(metadata: ChainMetadataForAltVM, privateKey: string): Promise<RadixSigner>;
|
|
11
|
+
getSignerAddress(): string;
|
|
12
|
+
supportsTransactionBatching(): boolean;
|
|
13
|
+
getBaseSigner(): RadixBaseSigner;
|
|
14
|
+
getGatewayClient(): import("@radixdlt/babylon-gateway-api-sdk").GatewayApiClient;
|
|
15
|
+
getBaseClient(): import("../utils/base.js").RadixBase;
|
|
16
|
+
transactionToPrintableJson(transaction: RadixSDKTransaction): Promise<object>;
|
|
17
|
+
sendAndConfirmTransaction(transaction: RadixSDKTransaction): Promise<RadixSDKReceipt>;
|
|
18
|
+
sendAndConfirmBatchTransactions(_transactions: RadixSDKTransaction[]): Promise<RadixSDKReceipt>;
|
|
19
|
+
publishPackage(params: {
|
|
20
|
+
code: Uint8Array;
|
|
21
|
+
packageDefinition: Uint8Array;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/clients/signer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAGL,eAAe,EACf,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,qBAAa,WACX,SAAQ,aACR,YAAW,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAE9D,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO,eAUN;IAED,OAAa,iBAAiB,CAC5B,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAkBtB;IAED,gBAAgB,IAAI,MAAM,CAEzB;IAED,2BAA2B,IAAI,OAAO,CAErC;IAED,aAAa,IAAI,eAAe,CAE/B;IAED,gBAAgB,iEAEf;IAED,aAAa,yCAEZ;IAEK,0BAA0B,CAC9B,WAAW,EAAE,mBAAmB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAgBjB;IAEK,yBAAyB,CAC7B,WAAW,EAAE,mBAAmB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAkB1B;IAEK,+BAA+B,CACnC,aAAa,EAAE,mBAAmB,EAAE,GACnC,OAAO,CAAC,eAAe,CAAC,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE;QAC3B,IAAI,EAAE,UAAU,CAAC;QACjB,iBAAiB,EAAE,UAAU,CAAC;KAC/B,GAAG,OAAO,CAAC,MAAM,CAAC,CAqClB;CACF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { EntityType, } from '@radixdlt/radix-engine-toolkit';
|
|
2
|
+
import { assert, strip0x } from '@recoillink/utils';
|
|
3
|
+
import { RadixBaseSigner } from '../utils/signer.js';
|
|
4
|
+
import { generateNewEd25519VirtualAccount, stringToTransactionManifest, transactionManifestToString, } from '../utils/utils.js';
|
|
5
|
+
import { RadixProvider } from './provider.js';
|
|
6
|
+
export class RadixSigner extends RadixProvider {
|
|
7
|
+
account;
|
|
8
|
+
signer;
|
|
9
|
+
constructor(account, options) {
|
|
10
|
+
super(options);
|
|
11
|
+
this.account = account;
|
|
12
|
+
this.signer = new RadixBaseSigner(this.networkId, this.gateway, this.base, this.account);
|
|
13
|
+
}
|
|
14
|
+
static async connectWithSigner(metadata, privateKey) {
|
|
15
|
+
assert(metadata.chainId, `chainId not defined in chain metadata`);
|
|
16
|
+
const networkId = parseInt(metadata.chainId.toString());
|
|
17
|
+
const rpcUrls = (metadata.rpcUrls ?? []).map(({ http }) => http);
|
|
18
|
+
const account = await generateNewEd25519VirtualAccount(strip0x(privateKey), networkId);
|
|
19
|
+
return new RadixSigner(account, {
|
|
20
|
+
networkId,
|
|
21
|
+
rpcUrls,
|
|
22
|
+
gatewayUrls: metadata.gatewayUrls?.map(({ http }) => http),
|
|
23
|
+
packageAddress: metadata.packageAddress,
|
|
24
|
+
chainMetadata: metadata,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
getSignerAddress() {
|
|
28
|
+
return this.account.address;
|
|
29
|
+
}
|
|
30
|
+
supportsTransactionBatching() {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
getBaseSigner() {
|
|
34
|
+
return this.signer;
|
|
35
|
+
}
|
|
36
|
+
getGatewayClient() {
|
|
37
|
+
return this.gateway;
|
|
38
|
+
}
|
|
39
|
+
getBaseClient() {
|
|
40
|
+
return this.base;
|
|
41
|
+
}
|
|
42
|
+
async transactionToPrintableJson(transaction) {
|
|
43
|
+
let manifest;
|
|
44
|
+
if (typeof transaction.manifest === 'string') {
|
|
45
|
+
manifest = transaction.manifest;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
manifest = await transactionManifestToString(transaction.manifest, this.networkId);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
...transaction,
|
|
52
|
+
manifest,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async sendAndConfirmTransaction(transaction) {
|
|
56
|
+
assert(transaction.networkId === this.networkId, `Transaction networkId (${transaction.networkId}) does not match signer networkId (${this.networkId})`);
|
|
57
|
+
let manifest;
|
|
58
|
+
if (typeof transaction.manifest === 'string') {
|
|
59
|
+
manifest = await stringToTransactionManifest(transaction.manifest, transaction.networkId);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
manifest = transaction.manifest;
|
|
63
|
+
}
|
|
64
|
+
return this.signer.signAndBroadcast(manifest);
|
|
65
|
+
}
|
|
66
|
+
async sendAndConfirmBatchTransactions(_transactions) {
|
|
67
|
+
throw new Error(`Radix does not support transaction batching`);
|
|
68
|
+
}
|
|
69
|
+
async publishPackage(params) {
|
|
70
|
+
const { code, packageDefinition } = params;
|
|
71
|
+
const transactionManifest = await this.base.createPublishPackageManifest({
|
|
72
|
+
from_address: this.account.address,
|
|
73
|
+
code,
|
|
74
|
+
packageDefinition,
|
|
75
|
+
});
|
|
76
|
+
const receipt = await this.signer.signAndBroadcast(transactionManifest);
|
|
77
|
+
// Extract package address from transaction receipt
|
|
78
|
+
const transactionStateUpdates = receipt.transaction.receipt
|
|
79
|
+
?.state_updates;
|
|
80
|
+
assert(transactionStateUpdates?.new_global_entities, `Expected global entities to be created when publishing a package on Radix network with id "${this.networkId}"`);
|
|
81
|
+
const publishedPackageInfo = transactionStateUpdates.new_global_entities.find((entity) => entity.entity_type === EntityType.GlobalPackage);
|
|
82
|
+
assert(publishedPackageInfo, `Expected global package info to be defined after publishing a new package on Radix network with id "${this.networkId}"`);
|
|
83
|
+
return publishedPackageInfo.entity_address;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/clients/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GatewayApiClient } from '@radixdlt/babylon-gateway-api-sdk';
|
|
2
|
+
import { ArtifactReader, ArtifactWriter } from '@recoillink/provider-sdk/artifact';
|
|
3
|
+
import { DeployedHookAddress, DeployedHookArtifact, HookType, IRawHookArtifactManager, RawHookArtifactConfigs } from '@recoillink/provider-sdk/hook';
|
|
4
|
+
import { RadixSigner } from '../clients/signer.js';
|
|
5
|
+
import { RadixBase } from '../utils/base.js';
|
|
6
|
+
export declare class RadixHookArtifactManager implements IRawHookArtifactManager {
|
|
7
|
+
private readonly gateway;
|
|
8
|
+
private readonly base;
|
|
9
|
+
private readonly mailboxAddress;
|
|
10
|
+
private readonly nativeTokenDenom;
|
|
11
|
+
constructor(gateway: GatewayApiClient, base: RadixBase, mailboxAddress: string, nativeTokenDenom: string);
|
|
12
|
+
readHook(address: string): Promise<DeployedHookArtifact>;
|
|
13
|
+
private radixHookTypeToAltVMHookType;
|
|
14
|
+
createReader<T extends HookType>(type: T): ArtifactReader<RawHookArtifactConfigs[T], DeployedHookAddress>;
|
|
15
|
+
createWriter<T extends HookType>(type: T, signer: RadixSigner): ArtifactWriter<RawHookArtifactConfigs[T], DeployedHookAddress>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=hook-artifact-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-artifact-manager.d.ts","sourceRoot":"","sources":["../../src/hook/hook-artifact-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAGrE,OAAO,EACL,cAAc,EACd,cAAc,EACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,uBAAuB,EACvB,sBAAsB,EAEvB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAS7C,qBAAa,wBAAyB,YAAW,uBAAuB;IAEpE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,YACmB,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACvC;IAEE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAU7D;IAED,OAAO,CAAC,4BAA4B;IAWpC,YAAY,CAAC,CAAC,SAAS,QAAQ,EAC7B,IAAI,EAAE,CAAC,GACN,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAgBhE;IAED,YAAY,CAAC,CAAC,SAAS,QAAQ,EAC7B,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,WAAW,GAClB,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CA8BhE;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { AltVM } from '@recoillink/provider-sdk';
|
|
2
|
+
import { throwUnsupportedHookType, } from '@recoillink/provider-sdk/hook';
|
|
3
|
+
import { getHookType } from './hook-query.js';
|
|
4
|
+
import { RadixIgpHookReader, RadixIgpHookWriter } from './igp-hook.js';
|
|
5
|
+
import { RadixMerkleTreeHookReader, RadixMerkleTreeHookWriter, } from './merkle-tree-hook.js';
|
|
6
|
+
export class RadixHookArtifactManager {
|
|
7
|
+
gateway;
|
|
8
|
+
base;
|
|
9
|
+
mailboxAddress;
|
|
10
|
+
nativeTokenDenom;
|
|
11
|
+
constructor(gateway, base, mailboxAddress, nativeTokenDenom) {
|
|
12
|
+
this.gateway = gateway;
|
|
13
|
+
this.base = base;
|
|
14
|
+
this.mailboxAddress = mailboxAddress;
|
|
15
|
+
this.nativeTokenDenom = nativeTokenDenom;
|
|
16
|
+
}
|
|
17
|
+
async readHook(address) {
|
|
18
|
+
// Detect hook type first
|
|
19
|
+
const radixHookType = await getHookType(this.gateway, address);
|
|
20
|
+
// Map Radix hook type to AltVM hook type
|
|
21
|
+
const hookType = this.radixHookTypeToAltVMHookType(radixHookType);
|
|
22
|
+
// Get the appropriate reader and read the hook
|
|
23
|
+
const reader = this.createReader(hookType);
|
|
24
|
+
return reader.read(address);
|
|
25
|
+
}
|
|
26
|
+
radixHookTypeToAltVMHookType(radixType) {
|
|
27
|
+
switch (radixType) {
|
|
28
|
+
case 'InterchainGasPaymaster':
|
|
29
|
+
return AltVM.HookType.INTERCHAIN_GAS_PAYMASTER;
|
|
30
|
+
case 'MerkleTreeHook':
|
|
31
|
+
return AltVM.HookType.MERKLE_TREE;
|
|
32
|
+
default:
|
|
33
|
+
throw new Error(`Unknown Radix hook type: ${radixType}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
createReader(type) {
|
|
37
|
+
const readers = {
|
|
38
|
+
merkleTreeHook: () => new RadixMerkleTreeHookReader(this.gateway),
|
|
39
|
+
interchainGasPaymaster: () => new RadixIgpHookReader(this.gateway),
|
|
40
|
+
};
|
|
41
|
+
const reader = readers[type];
|
|
42
|
+
if (!reader) {
|
|
43
|
+
return throwUnsupportedHookType(type, 'Radix');
|
|
44
|
+
}
|
|
45
|
+
return reader();
|
|
46
|
+
}
|
|
47
|
+
createWriter(type, signer) {
|
|
48
|
+
const baseSigner = signer.getBaseSigner();
|
|
49
|
+
const writers = {
|
|
50
|
+
merkleTreeHook: () => new RadixMerkleTreeHookWriter(this.gateway, baseSigner, this.base, this.mailboxAddress),
|
|
51
|
+
interchainGasPaymaster: () => new RadixIgpHookWriter(this.gateway, baseSigner, this.base, this.nativeTokenDenom),
|
|
52
|
+
};
|
|
53
|
+
const writer = writers[type];
|
|
54
|
+
if (!writer) {
|
|
55
|
+
return throwUnsupportedHookType(type, 'Radix');
|
|
56
|
+
}
|
|
57
|
+
return writer();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=hook-artifact-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-artifact-manager.js","sourceRoot":"","sources":["../../src/hook/hook-artifact-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAKjD,OAAO,EAML,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,OAAO,wBAAwB;IAEhB,OAAO;IACP,IAAI;IACJ,cAAc;IACd,gBAAgB;IAJnC,YACmB,OAAyB,EACzB,IAAe,EACf,cAAsB,EACtB,gBAAwB;uBAHxB,OAAO;oBACP,IAAI;8BACJ,cAAc;gCACd,gBAAgB;IAChC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,yBAAyB;QACzB,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/D,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,CAAC;QAElE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEO,4BAA4B,CAAC,SAAiB;QACpD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,wBAAwB;gBAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACjD,KAAK,gBAAgB;gBACnB,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YACpC;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,YAAY,CACV,IAAO;QAEP,MAAM,OAAO,GAKR;YACH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;YACjE,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;SACnE,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,YAAY,CACV,IAAO,EACP,MAAmB;QAEnB,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAE1C,MAAM,OAAO,GAKR;YACH,cAAc,EAAE,GAAG,EAAE,CACnB,IAAI,yBAAyB,CAC3B,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,cAAc,CACpB;YACH,sBAAsB,EAAE,GAAG,EAAE,CAC3B,IAAI,kBAAkB,CACpB,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,gBAAgB,CACtB;SACJ,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { GatewayApiClient } from '@radixdlt/babylon-gateway-api-sdk';
|
|
2
|
+
import { RadixHookTypes } from '../utils/types.js';
|
|
3
|
+
export declare function getHookType(gateway: Readonly<GatewayApiClient>, hookAddress: string): Promise<RadixHookTypes>;
|
|
4
|
+
export declare function getIgpHookConfig(gateway: Readonly<GatewayApiClient>, hookAddress: string): Promise<{
|
|
5
|
+
type: RadixHookTypes.IGP;
|
|
6
|
+
address: string;
|
|
7
|
+
owner: string;
|
|
8
|
+
destinationGasConfigs: {
|
|
9
|
+
[domainId: string]: {
|
|
10
|
+
gasOracle: {
|
|
11
|
+
tokenExchangeRate: string;
|
|
12
|
+
gasPrice: string;
|
|
13
|
+
};
|
|
14
|
+
gasOverhead: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
export declare function getMerkleTreeHookConfig(gateway: Readonly<GatewayApiClient>, hookAddress: string): Promise<{
|
|
19
|
+
type: RadixHookTypes.MERKLE_TREE;
|
|
20
|
+
address: string;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=hook-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-query.d.ts","sourceRoot":"","sources":["../../src/hook/hook-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAWrE,OAAO,EAAe,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYhE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAczB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,EAAE;QACrB,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,SAAS,EAAE;gBACT,iBAAiB,EAAE,MAAM,CAAC;gBAC1B,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;CACH,CAAC,CA2FD;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAiBD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { assert } from '@recoillink/utils';
|
|
2
|
+
import { getComponentOwner, getComponentState, getFieldValueFromEntityState, getKeysFromKvStore, getRadixComponentDetails, } from '../utils/base-query.js';
|
|
3
|
+
import { RadixHookTypes } from '../utils/types.js';
|
|
4
|
+
function isHookType(maybeHookType) {
|
|
5
|
+
switch (maybeHookType) {
|
|
6
|
+
case RadixHookTypes.IGP:
|
|
7
|
+
case RadixHookTypes.MERKLE_TREE:
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
export async function getHookType(gateway, hookAddress) {
|
|
13
|
+
const hookDetails = await getRadixComponentDetails(gateway, hookAddress, 'hook');
|
|
14
|
+
const hookType = hookDetails.blueprint_name;
|
|
15
|
+
assert(isHookType(hookType), `Expected component at address ${hookAddress} to be a hook but got ${hookType}`);
|
|
16
|
+
return hookType;
|
|
17
|
+
}
|
|
18
|
+
export async function getIgpHookConfig(gateway, hookAddress) {
|
|
19
|
+
const hookDetails = await getRadixComponentDetails(gateway, hookAddress, RadixHookTypes.IGP);
|
|
20
|
+
const hookType = hookDetails.blueprint_name;
|
|
21
|
+
assert(hookType === RadixHookTypes.IGP, `Expected component at address ${hookAddress} to be "${RadixHookTypes.IGP}" but got ${hookType}`);
|
|
22
|
+
const owner = await getComponentOwner(gateway, hookAddress, hookDetails);
|
|
23
|
+
const hookState = getComponentState(hookAddress, hookDetails);
|
|
24
|
+
const destinationGasConfigsKeyValueStoreAddress = getFieldValueFromEntityState('destination_gas_configs', hookAddress, hookState);
|
|
25
|
+
const keys = await getKeysFromKvStore(gateway, destinationGasConfigsKeyValueStoreAddress);
|
|
26
|
+
const destinationGasConfigs = {};
|
|
27
|
+
for (const key of keys) {
|
|
28
|
+
const { entries } = await gateway.state.innerClient.keyValueStoreData({
|
|
29
|
+
stateKeyValueStoreDataRequest: {
|
|
30
|
+
key_value_store_address: destinationGasConfigsKeyValueStoreAddress,
|
|
31
|
+
keys: [
|
|
32
|
+
{
|
|
33
|
+
key_hex: key.raw_hex,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const rawRemoteDomain = key.programmatic_json;
|
|
39
|
+
assert(rawRemoteDomain.kind === 'U32', `Expected domain id to be stored as a number on IGP at address ${hookAddress}`);
|
|
40
|
+
const remoteDomain = rawRemoteDomain.value;
|
|
41
|
+
const [entry] = entries;
|
|
42
|
+
assert(entry, `Expected to find at least one entry for gas config with key ${remoteDomain} on IGP at address ${hookAddress}`);
|
|
43
|
+
const rawGasConfig = entry.value.programmatic_json;
|
|
44
|
+
assert(rawGasConfig.kind === 'Tuple', `Expected gasConfig to be an object on IGP at address ${hookAddress}`);
|
|
45
|
+
const gasConfigFields = rawGasConfig.fields ?? [];
|
|
46
|
+
const gasOracleFields = gasConfigFields?.find((r) => r.field_name === 'gas_oracle')?.fields ?? [];
|
|
47
|
+
Object.assign(destinationGasConfigs, {
|
|
48
|
+
[remoteDomain]: {
|
|
49
|
+
gasOracle: {
|
|
50
|
+
tokenExchangeRate: getFieldValueFromEntityState('token_exchange_rate', hookAddress, {
|
|
51
|
+
fields: gasOracleFields,
|
|
52
|
+
}),
|
|
53
|
+
gasPrice: getFieldValueFromEntityState('gas_price', hookAddress, {
|
|
54
|
+
fields: gasOracleFields,
|
|
55
|
+
}),
|
|
56
|
+
},
|
|
57
|
+
gasOverhead: getFieldValueFromEntityState('gas_overhead', hookAddress, {
|
|
58
|
+
fields: gasConfigFields,
|
|
59
|
+
}),
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
type: RadixHookTypes.IGP,
|
|
65
|
+
address: hookAddress,
|
|
66
|
+
owner,
|
|
67
|
+
destinationGasConfigs,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export async function getMerkleTreeHookConfig(gateway, hookAddress) {
|
|
71
|
+
const hookDetails = await getRadixComponentDetails(gateway, hookAddress, RadixHookTypes.MERKLE_TREE);
|
|
72
|
+
const hookType = hookDetails.blueprint_name;
|
|
73
|
+
assert(hookType === RadixHookTypes.MERKLE_TREE, `Expected component at address ${hookAddress} to be "${RadixHookTypes.MERKLE_TREE}" but got ${hookType}`);
|
|
74
|
+
return {
|
|
75
|
+
type: RadixHookTypes.MERKLE_TREE,
|
|
76
|
+
address: hookAddress,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=hook-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-query.js","sourceRoot":"","sources":["../../src/hook/hook-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { GatewayApiClient } from '@radixdlt/babylon-gateway-api-sdk';
|
|
2
|
+
import { TransactionManifest } from '@radixdlt/radix-engine-toolkit';
|
|
3
|
+
import { RadixBase } from '../utils/base.js';
|
|
4
|
+
export declare function getCreateMerkleTreeHookTx(base: Readonly<RadixBase>, fromAddress: string, mailboxAddress: string): Promise<TransactionManifest>;
|
|
5
|
+
export declare function getCreateIgpTx(base: Readonly<RadixBase>, fromAddress: string, nativeTokenDenom: string): Promise<TransactionManifest>;
|
|
6
|
+
export declare function getSetIgpOwnerTx(base: Readonly<RadixBase>, gateway: Readonly<GatewayApiClient>, fromAddress: string, { igpAddress, newOwner, }: {
|
|
7
|
+
igpAddress: string;
|
|
8
|
+
newOwner: string;
|
|
9
|
+
}): Promise<TransactionManifest>;
|
|
10
|
+
export declare function getSetIgpDestinationGasConfigTx(base: Readonly<RadixBase>, fromAddress: string, { igpAddress, destinationGasConfig, }: {
|
|
11
|
+
igpAddress: string;
|
|
12
|
+
destinationGasConfig: {
|
|
13
|
+
remoteDomainId: number;
|
|
14
|
+
gasOracle: {
|
|
15
|
+
tokenExchangeRate: string;
|
|
16
|
+
gasPrice: string;
|
|
17
|
+
};
|
|
18
|
+
gasOverhead: string;
|
|
19
|
+
};
|
|
20
|
+
}): Promise<TransactionManifest>;
|
|
21
|
+
//# sourceMappingURL=hook-tx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-tx.d.ts","sourceRoot":"","sources":["../../src/hook/hook-tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EACL,mBAAmB,EAOpB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EACzB,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACnC,WAAW,EAAE,MAAM,EACnB,EACE,UAAU,EACV,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,mBAAmB,CAAC,CAiB9B;AAED,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,EACE,UAAU,EACV,oBAAoB,GACrB,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE;YACT,iBAAiB,EAAE,MAAM,CAAC;YAC1B,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,GACA,OAAO,CAAC,mBAAmB,CAAC,CAqB9B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ValueKind, address, array, tuple, u32, u128, } from '@radixdlt/radix-engine-toolkit';
|
|
2
|
+
import { getComponentOwnershipInfo, getRadixComponentDetails, } from '../utils/base-query.js';
|
|
3
|
+
import { INSTRUCTIONS, RadixHookTypes } from '../utils/types.js';
|
|
4
|
+
export async function getCreateMerkleTreeHookTx(base, fromAddress, mailboxAddress) {
|
|
5
|
+
return base.createCallFunctionManifest(fromAddress, base.getHyperlanePackageDefAddress(), RadixHookTypes.MERKLE_TREE, INSTRUCTIONS.INSTANTIATE, [address(mailboxAddress)]);
|
|
6
|
+
}
|
|
7
|
+
export async function getCreateIgpTx(base, fromAddress, nativeTokenDenom) {
|
|
8
|
+
return base.createCallFunctionManifest(fromAddress, base.getHyperlanePackageDefAddress(), RadixHookTypes.IGP, INSTRUCTIONS.INSTANTIATE, [address(nativeTokenDenom)]);
|
|
9
|
+
}
|
|
10
|
+
export async function getSetIgpOwnerTx(base, gateway, fromAddress, { igpAddress, newOwner, }) {
|
|
11
|
+
const hookDetails = await getRadixComponentDetails(gateway, igpAddress, RadixHookTypes.IGP);
|
|
12
|
+
const ownershipInfo = getComponentOwnershipInfo(igpAddress, hookDetails);
|
|
13
|
+
const resourceAddress = ownershipInfo.rule.access_rule.proof_rule.requirement.resource;
|
|
14
|
+
return base.transfer({
|
|
15
|
+
from_address: fromAddress,
|
|
16
|
+
to_address: newOwner,
|
|
17
|
+
resource_address: resourceAddress,
|
|
18
|
+
amount: '1',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function getSetIgpDestinationGasConfigTx(base, fromAddress, { igpAddress, destinationGasConfig, }) {
|
|
22
|
+
return base.createCallMethodManifestWithOwner(fromAddress, igpAddress, 'set_destination_gas_configs', [
|
|
23
|
+
array(ValueKind.Tuple, tuple(u32(destinationGasConfig.remoteDomainId), tuple(tuple(u128(destinationGasConfig.gasOracle.tokenExchangeRate), u128(destinationGasConfig.gasOracle.gasPrice)), u128(destinationGasConfig.gasOverhead)))),
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=hook-tx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-tx.js","sourceRoot":"","sources":["../../src/hook/hook-tx.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,OAAO,EACP,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAI,GACL,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAyB,EACzB,WAAmB,EACnB,cAAsB;IAEtB,OAAO,IAAI,CAAC,0BAA0B,CACpC,WAAW,EACX,IAAI,CAAC,6BAA6B,EAAE,EACpC,cAAc,CAAC,WAAW,EAC1B,YAAY,CAAC,WAAW,EACxB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAyB,EACzB,WAAmB,EACnB,gBAAwB;IAExB,OAAO,IAAI,CAAC,0BAA0B,CACpC,WAAW,EACX,IAAI,CAAC,6BAA6B,EAAE,EACpC,cAAc,CAAC,GAAG,EAClB,YAAY,CAAC,WAAW,EACxB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAyB,EACzB,OAAmC,EACnC,WAAmB,EACnB,EACE,UAAU,EACV,QAAQ,GAIT;IAED,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAChD,OAAO,EACP,UAAU,EACV,cAAc,CAAC,GAAG,CACnB,CAAC;IAEF,MAAM,aAAa,GAAG,yBAAyB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,eAAe,GACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;IAEjE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACnB,YAAY,EAAE,WAAW;QACzB,UAAU,EAAE,QAAQ;QACpB,gBAAgB,EAAE,eAAe;QACjC,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,IAAyB,EACzB,WAAmB,EACnB,EACE,UAAU,EACV,oBAAoB,GAWrB;IAED,OAAO,IAAI,CAAC,iCAAiC,CAC3C,WAAW,EACX,UAAU,EACV,6BAA6B,EAC7B;QACE,KAAK,CACH,SAAS,CAAC,KAAK,EACf,KAAK,CACH,GAAG,CAAC,oBAAoB,CAAC,cAAc,CAAC,EACxC,KAAK,CACH,KAAK,CACH,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,iBAAiB,CAAC,EACtD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC9C,EACD,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CACvC,CACF,CACF;KACF,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GatewayApiClient } from '@radixdlt/babylon-gateway-api-sdk';
|
|
2
|
+
import { ArtifactDeployed, ArtifactNew, ArtifactReader, ArtifactWriter } from '@recoillink/provider-sdk/artifact';
|
|
3
|
+
import { DeployedHookAddress, IgpHookConfig } from '@recoillink/provider-sdk/hook';
|
|
4
|
+
import { TxReceipt } from '@recoillink/provider-sdk/module';
|
|
5
|
+
import { RadixBase } from '../utils/base.js';
|
|
6
|
+
import { RadixBaseSigner } from '../utils/signer.js';
|
|
7
|
+
import { AnnotatedRadixTransaction } from '../utils/types.js';
|
|
8
|
+
export declare class RadixIgpHookReader implements ArtifactReader<IgpHookConfig, DeployedHookAddress> {
|
|
9
|
+
protected readonly gateway: Readonly<GatewayApiClient>;
|
|
10
|
+
constructor(gateway: Readonly<GatewayApiClient>);
|
|
11
|
+
read(address: string): Promise<ArtifactDeployed<IgpHookConfig, DeployedHookAddress>>;
|
|
12
|
+
}
|
|
13
|
+
export declare class RadixIgpHookWriter extends RadixIgpHookReader implements ArtifactWriter<IgpHookConfig, DeployedHookAddress> {
|
|
14
|
+
private readonly signer;
|
|
15
|
+
private readonly base;
|
|
16
|
+
private readonly nativeTokenDenom;
|
|
17
|
+
constructor(gateway: Readonly<GatewayApiClient>, signer: RadixBaseSigner, base: RadixBase, nativeTokenDenom: string);
|
|
18
|
+
create(artifact: ArtifactNew<IgpHookConfig>): Promise<[
|
|
19
|
+
ArtifactDeployed<IgpHookConfig, DeployedHookAddress>,
|
|
20
|
+
TxReceipt[]
|
|
21
|
+
]>;
|
|
22
|
+
update(artifact: ArtifactDeployed<IgpHookConfig, DeployedHookAddress>): Promise<AnnotatedRadixTransaction[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=igp-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"igp-hook.d.ts","sourceRoot":"","sources":["../../src/hook/igp-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAGrE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,cAAc,EAEd,cAAc,EACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,aAAa,EACd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAS9D,qBAAa,kBAAmB,YAAW,cAAc,CACvD,aAAa,EACb,mBAAmB,CACpB;IACa,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC;IAAlE,YAA+B,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAI;IAEhE,IAAI,CACR,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CA6C/D;CACF;AAED,qBAAa,kBACX,SAAQ,kBACR,YAAW,cAAc,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAI3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,YACE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,EACf,gBAAgB,EAAE,MAAM,EAG1C;IAEK,MAAM,CACV,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,GACnC,OAAO,CACR;QAAC,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC;QAAE,SAAS,EAAE;KAAC,CACpE,CAoEA;IAEK,MAAM,CACV,QAAQ,EAAE,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC,GAC7D,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAiEtC;CACF"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { AltVM } from '@recoillink/provider-sdk';
|
|
2
|
+
import { ArtifactState, } from '@recoillink/provider-sdk/artifact';
|
|
3
|
+
import { eqAddressRadix } from '@recoillink/utils';
|
|
4
|
+
import { getIgpHookConfig } from './hook-query.js';
|
|
5
|
+
import { getCreateIgpTx, getSetIgpDestinationGasConfigTx, getSetIgpOwnerTx, } from './hook-tx.js';
|
|
6
|
+
export class RadixIgpHookReader {
|
|
7
|
+
gateway;
|
|
8
|
+
constructor(gateway) {
|
|
9
|
+
this.gateway = gateway;
|
|
10
|
+
}
|
|
11
|
+
async read(address) {
|
|
12
|
+
const hookConfig = await getIgpHookConfig(this.gateway, address);
|
|
13
|
+
// Map Radix IGP config to provider-sdk IgpHookConfig format
|
|
14
|
+
// Note: Using numeric domain IDs as keys (Artifact API), not chain names
|
|
15
|
+
const overhead = {};
|
|
16
|
+
const oracleConfig = {};
|
|
17
|
+
for (const [domainIdStr, gasConfig] of Object.entries(hookConfig.destinationGasConfigs)) {
|
|
18
|
+
const domainId = parseInt(domainIdStr);
|
|
19
|
+
overhead[domainId] = parseInt(gasConfig.gasOverhead);
|
|
20
|
+
oracleConfig[domainId] = {
|
|
21
|
+
gasPrice: gasConfig.gasOracle.gasPrice,
|
|
22
|
+
tokenExchangeRate: gasConfig.gasOracle.tokenExchangeRate,
|
|
23
|
+
// Radix IGP doesn't store tokenDecimals on-chain.
|
|
24
|
+
// The exchange rate is pre-calculated to include decimal adjustments.
|
|
25
|
+
// tokenDecimals is left undefined (optional field).
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
artifactState: ArtifactState.DEPLOYED,
|
|
30
|
+
config: {
|
|
31
|
+
type: AltVM.HookType.INTERCHAIN_GAS_PAYMASTER,
|
|
32
|
+
owner: hookConfig.owner,
|
|
33
|
+
// Radix IGP doesn't have beneficiary and oracleKey in the same way as EVM
|
|
34
|
+
// Setting them to owner as a placeholder
|
|
35
|
+
beneficiary: hookConfig.owner,
|
|
36
|
+
oracleKey: hookConfig.owner,
|
|
37
|
+
overhead,
|
|
38
|
+
oracleConfig,
|
|
39
|
+
},
|
|
40
|
+
deployed: {
|
|
41
|
+
address: hookConfig.address,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class RadixIgpHookWriter extends RadixIgpHookReader {
|
|
47
|
+
signer;
|
|
48
|
+
base;
|
|
49
|
+
nativeTokenDenom;
|
|
50
|
+
constructor(gateway, signer, base, nativeTokenDenom) {
|
|
51
|
+
super(gateway);
|
|
52
|
+
this.signer = signer;
|
|
53
|
+
this.base = base;
|
|
54
|
+
this.nativeTokenDenom = nativeTokenDenom;
|
|
55
|
+
}
|
|
56
|
+
async create(artifact) {
|
|
57
|
+
const { config } = artifact;
|
|
58
|
+
const allReceipts = [];
|
|
59
|
+
// Create the IGP
|
|
60
|
+
const transactionManifest = await getCreateIgpTx(this.base, this.signer.getAddress(), this.nativeTokenDenom);
|
|
61
|
+
const createReceipt = await this.signer.signAndBroadcast(transactionManifest);
|
|
62
|
+
const address = await this.base.getNewComponent(createReceipt);
|
|
63
|
+
allReceipts.push(createReceipt);
|
|
64
|
+
// Set destination gas configs for each domain
|
|
65
|
+
for (const [domainIdStr, gasConfig] of Object.entries(config.oracleConfig)) {
|
|
66
|
+
const domainId = parseInt(domainIdStr);
|
|
67
|
+
const setConfigTx = await getSetIgpDestinationGasConfigTx(this.base, this.signer.getAddress(), {
|
|
68
|
+
igpAddress: address,
|
|
69
|
+
destinationGasConfig: {
|
|
70
|
+
remoteDomainId: domainId,
|
|
71
|
+
gasOracle: {
|
|
72
|
+
tokenExchangeRate: gasConfig.tokenExchangeRate,
|
|
73
|
+
gasPrice: gasConfig.gasPrice,
|
|
74
|
+
},
|
|
75
|
+
gasOverhead: config.overhead[domainId]?.toString() || '0',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const configReceipt = await this.signer.signAndBroadcast(setConfigTx);
|
|
79
|
+
allReceipts.push(configReceipt);
|
|
80
|
+
}
|
|
81
|
+
// Transfer ownership if the configured owner is different from the signer
|
|
82
|
+
if (!eqAddressRadix(this.signer.getAddress(), config.owner)) {
|
|
83
|
+
const setOwnerTx = await getSetIgpOwnerTx(this.base, this.gateway, this.signer.getAddress(), {
|
|
84
|
+
igpAddress: address,
|
|
85
|
+
newOwner: config.owner,
|
|
86
|
+
});
|
|
87
|
+
const ownerReceipt = await this.signer.signAndBroadcast(setOwnerTx);
|
|
88
|
+
allReceipts.push(ownerReceipt);
|
|
89
|
+
}
|
|
90
|
+
const deployedArtifact = {
|
|
91
|
+
artifactState: ArtifactState.DEPLOYED,
|
|
92
|
+
config: artifact.config,
|
|
93
|
+
deployed: {
|
|
94
|
+
address,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
return [deployedArtifact, allReceipts];
|
|
98
|
+
}
|
|
99
|
+
async update(artifact) {
|
|
100
|
+
const { config, deployed } = artifact;
|
|
101
|
+
const updateTxs = [];
|
|
102
|
+
// Read current state
|
|
103
|
+
const currentState = await this.read(deployed.address);
|
|
104
|
+
// This is the address that has to execute the update transactions
|
|
105
|
+
const currentOwnerAddress = currentState.config.owner;
|
|
106
|
+
// Update destination gas configs
|
|
107
|
+
for (const [domainIdStr, gasConfig] of Object.entries(config.oracleConfig)) {
|
|
108
|
+
const domainId = parseInt(domainIdStr);
|
|
109
|
+
const currentGasConfig = currentState.config.oracleConfig[domainId];
|
|
110
|
+
const needsUpdate = !currentGasConfig ||
|
|
111
|
+
currentGasConfig.tokenExchangeRate !== gasConfig.tokenExchangeRate ||
|
|
112
|
+
currentGasConfig.gasPrice !== gasConfig.gasPrice ||
|
|
113
|
+
currentState.config.overhead[domainId] !== config.overhead[domainId];
|
|
114
|
+
if (needsUpdate) {
|
|
115
|
+
const setConfigTx = await getSetIgpDestinationGasConfigTx(this.base, currentOwnerAddress, {
|
|
116
|
+
igpAddress: deployed.address,
|
|
117
|
+
destinationGasConfig: {
|
|
118
|
+
remoteDomainId: domainId,
|
|
119
|
+
gasOracle: {
|
|
120
|
+
tokenExchangeRate: gasConfig.tokenExchangeRate,
|
|
121
|
+
gasPrice: gasConfig.gasPrice,
|
|
122
|
+
},
|
|
123
|
+
gasOverhead: config.overhead[domainId]?.toString() || '0',
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
updateTxs.push({
|
|
127
|
+
annotation: `Updating IGP gas config for domain ${domainId}`,
|
|
128
|
+
networkId: this.base.getNetworkId(),
|
|
129
|
+
manifest: setConfigTx,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Owner transfer must be last transaction as the current owner executes all updates
|
|
134
|
+
if (!eqAddressRadix(currentState.config.owner, config.owner)) {
|
|
135
|
+
const setOwnerTx = await getSetIgpOwnerTx(this.base, this.gateway, currentOwnerAddress, {
|
|
136
|
+
igpAddress: deployed.address,
|
|
137
|
+
newOwner: config.owner,
|
|
138
|
+
});
|
|
139
|
+
updateTxs.push({
|
|
140
|
+
annotation: 'Setting new IGP owner',
|
|
141
|
+
networkId: this.base.getNetworkId(),
|
|
142
|
+
manifest: setOwnerTx,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return updateTxs;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=igp-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"igp-hook.js","sourceRoot":"","sources":["../../src/hook/igp-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GatewayApiClient } from '@radixdlt/babylon-gateway-api-sdk';
|
|
2
|
+
import { ArtifactDeployed, ArtifactNew, ArtifactReader, ArtifactWriter } from '@recoillink/provider-sdk/artifact';
|
|
3
|
+
import { DeployedHookAddress, MerkleTreeHookConfig } from '@recoillink/provider-sdk/hook';
|
|
4
|
+
import { TxReceipt } from '@recoillink/provider-sdk/module';
|
|
5
|
+
import { RadixBase } from '../utils/base.js';
|
|
6
|
+
import { RadixBaseSigner } from '../utils/signer.js';
|
|
7
|
+
import { AnnotatedRadixTransaction } from '../utils/types.js';
|
|
8
|
+
export declare class RadixMerkleTreeHookReader implements ArtifactReader<MerkleTreeHookConfig, DeployedHookAddress> {
|
|
9
|
+
private readonly gateway;
|
|
10
|
+
constructor(gateway: Readonly<GatewayApiClient>);
|
|
11
|
+
read(address: string): Promise<ArtifactDeployed<MerkleTreeHookConfig, DeployedHookAddress>>;
|
|
12
|
+
}
|
|
13
|
+
export declare class RadixMerkleTreeHookWriter extends RadixMerkleTreeHookReader implements ArtifactWriter<MerkleTreeHookConfig, DeployedHookAddress> {
|
|
14
|
+
private readonly signer;
|
|
15
|
+
private readonly base;
|
|
16
|
+
private readonly mailboxAddress;
|
|
17
|
+
constructor(gateway: Readonly<GatewayApiClient>, signer: RadixBaseSigner, base: RadixBase, mailboxAddress: string);
|
|
18
|
+
create(artifact: ArtifactNew<MerkleTreeHookConfig>): Promise<[
|
|
19
|
+
ArtifactDeployed<MerkleTreeHookConfig, DeployedHookAddress>,
|
|
20
|
+
TxReceipt[]
|
|
21
|
+
]>;
|
|
22
|
+
update(_artifact: ArtifactDeployed<MerkleTreeHookConfig, DeployedHookAddress>): Promise<AnnotatedRadixTransaction[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=merkle-tree-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle-tree-hook.d.ts","sourceRoot":"","sources":["../../src/hook/merkle-tree-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAGrE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,cAAc,EAEd,cAAc,EACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qBAAa,yBAA0B,YAAW,cAAc,CAC9D,oBAAoB,EACpB,mBAAmB,CACpB;IACa,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAI;IAE9D,IAAI,CACR,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAYtE;CACF;AAED,qBAAa,yBACX,SAAQ,yBACR,YAAW,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IAIlE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,YACE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EAGxC;IAEK,MAAM,CACV,QAAQ,EAAE,WAAW,CAAC,oBAAoB,CAAC,GAC1C,OAAO,CACR;QAAC,gBAAgB,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;QAAE,SAAS,EAAE;KAAC,CAC3E,CAsBA;IAEK,MAAM,CACV,SAAS,EAAE,gBAAgB,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,GACrE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAGtC;CACF"}
|